ls -la /dev/tty
显示输出:
crw-rw-rw- 1 root tty 5, 0 Dec 14 22:21 /dev/tty
在开头的 c 是什么意思?当我执行类似 pwd > /dev/tty
的操作时,它会输出到标准输出。那么文件 /dev/tty 包含什么内容?
ls -la /dev/tty
显示输出:
crw-rw-rw- 1 root tty 5, 0 Dec 14 22:21 /dev/tty
在开头的 c 是什么意思?当我执行类似 pwd > /dev/tty
的操作时,它会输出到标准输出。那么文件 /dev/tty 包含什么内容?
'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”可以查看它是什么(请参阅手动页tty(1))。 / dev / tty类似于指向具有一些附加功能的实际终端设备名称的链接,这对C程序员很有用:请参阅手动页tty(4)。
这里是 man 手册:http://linux.die.net/man/4/tty
(该手册介绍了 tty 设备在 Linux 系统中的使用方法)/dev/tty
是当前进程的控制终端(如果有)。正如jtl999所说,它是一个字符特殊文件;这就是 ls -l
输出中 c
的含义。
man 4 tty
或者 man -s 4 tty
可以给你更多信息, 或者你可以在这里在线阅读 man 页面。
顺便提一下,pwd > /dev/tty
不一定会将内容打印到 shell 的标准输出(尽管它是 pwd
命令的标准输出)。如果 shell 的标准输出已经被重定向到除终端之外的其他位置,则 /dev/tty
仍然指向终端。
你也可以从 /dev/tty
中读取数据,通常会从键盘读取输入。
pwd > /dev/tty
不一定会打印到标准输出。如果标准输出已被重定向到终端以外的其他地方,那么它就不会打印到标准输出。在我看来,它总是会将进程的文件描述符1设置为 /dev/tty
。你能解释一下吗? - Dagang>/dev/tty
总是意味着使 fd 1 指向终端,而不管 fd 1 原本指向哪里。你能提供一个例子来支持你的论点吗? - Dagang( echo to stdout ; echo to tty > /dev/tty ) > a_file
。其中,“to stdout”会被重定向到a_file文件里,但是“to tty”仍会显示在终端上,不会被重定向到a_file文件里。括号内部的子shell的标准输出被重定向到了文件a_file里,但是控制终端仍然是父shell所在的终端,比如xterm、ssh或者串行控制台等。 - TrentPfind . -type d -name dummy | tee /dev/tty | xargs rm
。 - Louay Alakkadpwd
必须是一个shell内置命令”是不正确的。它可以是一个shell内置命令,但不一定是。我可能当时想到的是cd
。 - Keith Thompson
/dev/tty
的方法是,如果你试图在管道中调用一个编辑器(例如使用xargs
),由于xargs
的标准输入是一些文件列表而不是你的终端,仅仅执行| xargs emacs
会破坏你的终端。相反,你可以使用| xargs sh -c 'emacs "$@" </dev/tty' emacs
,即使xargs
的输入来自其他地方,也可以将编辑器连接到你的终端。(我的系统上的xargs
手册建议使用此用法。) - Soren Bjornstad