命令 `tty` 和文件 `/dev/tty` 的输出都指向当前 bash 进程的控制终端吗?

命令 `tty` 和文件 `/dev/tty` 的输出都指向当前 bash 进程的控制终端吗?
  1. man tty

    tty - 打印连接到标准输入的终端的文件名

    $ tty
    /dev/pts/2
    
  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/2bash shell 的控制终端吗?

/dev/tty并且/dev/pts/2彼此之间不是符号链接,那么它们是不同的文件吗?

谢谢。

后续帖子我当前的控制终端和`/dev/tty`之间有什么关系?

答案1

命令tty(1) 返回连接到标准输入的终端的名称。这可能是控制终端,也可能不是。该进程甚至可能有一个控制终端,但并不是一成不变的是该终端必须连接到标准输入。

来自 POSIXtty(1)的手册页:

tty 实用程序应将作为标准输入打开的终端的名称写入标准输出。使用的名称应等于 ttyname()POSIX.1-2008 系统接口卷中定义的函数返回的字符串。

亲自尝试一下;跑步

< /dev/null sh -c 'tty; sleep 10; echo "Done."'

并在看到由 写出的消息“not a tty”后按 Ctrl+C,tty因为标准输入不是(伪)终端。

另一方面,/dev/tty始终是进程的控制终端的同义词,前提是该进程实际上一个控制终端。

答案2

命令的输出tty和文件/dev/tty都指向当前进程的控制终端吗?

嗯,不,它们不一样。tty输出与其连接的 tty 的名称标准输入。这不一定与控制终端相同(这是什么/dev/tty指)。

$ tty
/dev/pts/12
$ tty < /dev/pts/1
/dev/pts/1
$ tty < /dev/null
not a tty

当然,通常如果你连接stdin到一个终端,它就是控制终端。

我所见过的用例tty是确定脚本是否正在交互运行。对于该用途,检查stdin而不是控制终端可以检测stdin连接到终端以外的其他设备以及用户无法提供交互式输入的情况。例如,maybe_interactive.sh < some_input_file从交互式 shell运行。

/dev/tty 和 /dev/pts/2 不是彼此的符号链接,那么它们是不同的文件吗?

/dev/tty不能是符号链接,因为不同进程的控制终端不同,并且每个进程的符号链接都相同。

相关内容