【发布时间】:2011-12-15 03:24:15
【问题描述】:
ls -la /dev/tty 显示输出:
crw-rw-rw- 1 root tty 5, 0 Dec 14 22:21 /dev/tty
开头的c是什么意思?当我执行pwd > /dev/tty 之类的操作时,它会打印到标准输出。文件 /dev/tty 包含什么?
【问题讨论】:
标签: unix
ls -la /dev/tty 显示输出:
crw-rw-rw- 1 root tty 5, 0 Dec 14 22:21 /dev/tty
开头的c是什么意思?当我执行pwd > /dev/tty 之类的操作时,它会打印到标准输出。文件 /dev/tty 包含什么?
【问题讨论】:
标签: unix
'c' 表示它是一个字符设备。 tty 是一个特殊文件,代表当前进程的“控制终端”。
字符设备
Unix 支持“设备文件”,它根本不是真正的文件,而是硬件设备的类似文件的访问点。 “字符”设备是逐字节接口的设备(与缓冲 IO 不同)。
TTY
/dev/tty 是一个特殊文件,代表当前进程的终端。因此,当您echo 1 > /dev/tty 时,您的消息 ('1') 将出现在您的屏幕上。同样,当您cat /dev/tty 时,您的后续输入会重复(直到您按下 Ctrl-C)。
/dev/tty 本身并不“包含”任何东西,但是您可以从中读取并写入它(对于它的价值)。我想不出它有什么用处,但是有一些类似的文件对简单的 IO 操作非常有用(例如,/dev/ttyS0 通常是你的串口)
此引用来自http://tldp.org/HOWTO/Text-Terminal-HOWTO-7.html#ss7.3:
/dev/tty 代表当前的控制终端(如果有) 过程。找出哪些 tty 连接到哪些进程使用 shell 提示符下的“ps -a”命令(命令行)。看着那(这 “tty”列。对于您所在的 shell 进程,/dev/tty 是 您现在使用的终端。在 shell 提示符下输入“tty”来查看 它是(参见手册 pg.tty(1))。 /dev/tty 类似于指向的链接 具有一些附加功能的实际终端设备名称 C 程序员:参见手册页 tty(4)。
【讨论】:
/dev/tty 的一个很好的用途是,如果您尝试调用管道中的编辑器(例如,使用 xargs)。由于xargs 的标准输入是一些文件列表而不是您的终端,因此只需执行例如| xargs emacs 就会搞砸您的终端。相反,您可以使用| xargs sh -c 'emacs "$@" </dev/tty' emacs 将编辑器连接到您的终端,即使xargs 的输入来自其他地方。 (我系统上的 xargs 手册页建议了这种用法。)
/dev/tty 是当前进程的控制终端(如果有)的同义词。正如jtl999所说,它是一个字符特殊文件;这就是ls -l 输出中的c 的含义。
man 4 tty 或man -s 4 tty 应该会给你更多信息,或者你可以阅读在线手册页here。
顺便说一句,pwd > /dev/tty 不一定 打印到 shell 的标准输出(尽管它是 pwd 命令的标准输出)。如果 shell 的标准输出被重定向到终端以外的地方,/dev/tty 仍然指向终端。
您也可以从/dev/tty 读取,这通常会从键盘读取。
【讨论】:
pwd > /dev/tty doesn't necessarily print to stdout. If standard output has been redirected to something other than the terminal。在我看来,它总是将进程的文件描述符 1 设置为 /dev/tty。你能解释一下吗?
>/dev/tty 始终意味着使 fd 1 引用终端,而不管 fd 1 引用的位置。你能举个例子来支持你的论点吗?
( echo to stdout ; echo to tty > /dev/tty ) > a_file 会发现“to stdout”被重定向到 a_file,但“to tty”仍会出现在运行 shell 的终端上,并且不会被重定向到 a_file。运行 ( ... ) 内的部分的子 shell 已将标准输出重定向到一个文件,但控制终端仍然是父 shell 正在运行的任何终端,例如您的 xterm 或 ssh 或串行控制台等。
find . -type d -name dummy | tee /dev/tty | xargs rm
'c' 表示它是一个字符特殊文件。
【讨论】: