从
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
彼此之间不是符号链接,那么它们是不同的文件吗?
谢谢。
答案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
不能是符号链接,因为不同进程的控制终端不同,并且每个进程的符号链接都相同。