从
man tty
tty - 打印连接到标准输入的终端的文件名
$ tty /dev/pts/2
来自 APUE:
历史上,大多数版本的 UNIX 系统中控制终端的名称都是
/dev/tty
. POSIX.1 提供了一个运行时函数,我们可以调用它来确定控制终端的名称。#include <stdio.h> char *ctermid(char *ptr);
$ ls -la /dev/tty crw-rw-rw- 1 root tty 5, 0 May 26 00:16 /dev/tty
所以我想知道命令的输出tty
和文件是否/dev/tty
都引用了当前 bash 进程的控制终端?
如果是,为什么命令tty
输出一个伪终端从文件/dev/pts/2
,它不同于/dev/tty
?
由于终端仿真器lxterminal
和其中运行的 bash shell 使用伪终端对,伪终端从站不是/dev/pts/2
bash shell 的控制终端吗?
/dev/tty
并且/dev/pts/2
不是彼此的符号链接,所以它们是不同的文件吗?
谢谢。
命令
tty
(1) 返回连接到标准输入的终端名称。这可能是控制终端,也可能不是。该进程甚至可能有一个控制终端,但该终端必须连接到标准输入并不是一成不变的。从(1)的 POSIX手册页
tty
:自己试试吧;跑
并在看到“not a tty”写出的消息后按 Ctrl+C,
tty
因为标准输入不是(伪)终端。另一方面,
/dev/tty
它始终是进程的控制终端的同义词,前提是该进程实际上有一个控制终端。嗯,不,它们不一样。
tty
输出连接到它的标准输入的 tty 的名称。这不一定与控制终端(/dev/tty
所指的)相同。当然,通常如果您
stdin
连接到终端,它就是控制终端。我见过的用例
tty
是确定脚本是否以交互方式运行。对于这种用途,检查stdin
而不是控制终端允许检测stdin
连接到终端以外的东西以及用户无法提供交互式输入的情况。例如maybe_interactive.sh < some_input_file
从交互式外壳运行。/dev/tty
不能是符号链接,因为不同进程的控制终端不同,并且每个进程的符号链接都是相同的。