iBug Asked: 2018-06-30 22:07:12 +0800 CST2018-06-30 22:07:12 +0800 CST 2018-06-30 22:07:12 +0800 CST `less` 如何从标准输入获取数据,同时仍然能够读取用户的命令? 772 正如你们大多数人多次做过的那样,使用以下命令查看长文本很方便less: some_command | less 现在它的标准输入连接到一个管道(FIFO)。它怎么还能读取像 up/down/quit 这样的命令? less 2 个回答 Voted Best Answer Stephen Kitt 2018-06-30T23:24:44+08:002018-06-30T23:24:44+08:00 正如William Pursell所提到的,less从终端读取用户的击键。它显式打开/dev/tty控制终端;这给了它一个与标准输入分开的文件描述符,它可以从中读取用户的交互式输入。如有必要,它可以同时从其标准输入读取数据以显示。(如有必要,它也可以直接写入终端。) 您可以通过运行看到这种情况 some_command | strace -o less.trace -e open,read,write less 移动输入,退出less并查看less.trace: 你会看到它的内容 open /dev/tty,并从文件描述符 0 和打开时返回的任何一个/dev/tty(可能是 3)中读取。 对于希望确保它们正在从终端读取和写入终端的程序来说,这是一种常见的做法。一个例子是 SSH,例如当它要求输入密码或密码时。 正如schily所解释的,如果无法打开,将从其标准错误(文件描述符 2)中读取。的使用是在 1991 年 4 月 2 日发布的版本 177 中引入的。/dev/ttylessless/dev/tty 如果您按照Hagen von Eitzen的建议cat /dev/tty | less尝试运行,将成功打开,但在关闭之前不会从中获得任何输入。所以你会看到屏幕空白,在你按下杀死(或以其他方式杀死它)之前什么都没有;然后将显示您在运行时键入的任何内容,并允许您控制它。less/dev/ttycatCtrlCcatlesscat schily 2018-07-01T00:33:31+08:002018-07-01T00:33:31+08:00 UNIX 提供了两种在标准输入被重定向时读取用户输入的方法: 原始方法是从stderr读取。Stderr 对写入和读取是开放的,这在 POSIX 中仍然被提及。 后来的 UNIX 版本(大约 1979 年)添加了一个/dev/tty驱动程序接口,允许打开进程的控制 tty。由于存在没有控制 tty 的进程,因此尝试打开可能会/dev/tty失败。因此,友好的编写软件会回退到原始方法,然后尝试从 stderr 读取。
正如William Pursell所提到的,
less
从终端读取用户的击键。它显式打开/dev/tty
控制终端;这给了它一个与标准输入分开的文件描述符,它可以从中读取用户的交互式输入。如有必要,它可以同时从其标准输入读取数据以显示。(如有必要,它也可以直接写入终端。)您可以通过运行看到这种情况
移动输入,退出
less
并查看less.trace
: 你会看到它的内容 open/dev/tty
,并从文件描述符 0 和打开时返回的任何一个/dev/tty
(可能是 3)中读取。对于希望确保它们正在从终端读取和写入终端的程序来说,这是一种常见的做法。一个例子是 SSH,例如当它要求输入密码或密码时。
正如schily所解释的,如果无法打开,将从其标准错误(文件描述符 2)中读取。的使用是在 1991 年 4 月 2 日发布的版本 177 中引入的。
/dev/tty
less
less
/dev/tty
如果您按照Hagen von Eitzen的建议
cat /dev/tty | less
尝试运行,将成功打开,但在关闭之前不会从中获得任何输入。所以你会看到屏幕空白,在你按下杀死(或以其他方式杀死它)之前什么都没有;然后将显示您在运行时键入的任何内容,并允许您控制它。less
/dev/tty
cat
CtrlCcat
less
cat
UNIX 提供了两种在标准输入被重定向时读取用户输入的方法:
原始方法是从stderr读取。Stderr 对写入和读取是开放的,这在 POSIX 中仍然被提及。
后来的 UNIX 版本(大约 1979 年)添加了一个
/dev/tty
驱动程序接口,允许打开进程的控制 tty。由于存在没有控制 tty 的进程,因此尝试打开可能会/dev/tty
失败。因此,友好的编写软件会回退到原始方法,然后尝试从 stderr 读取。