Answers:
less
将文本打印到标准输出。标准输出
less text | cut -d: -f1
)less text > tmp
有一个名为“ isa tty ” 的C函数,该函数检查输出是否将输出到tty(小于4.81,main.c,第112行)。如果是这样,它将使用缓冲区查看器,否则其行为类似于cat
。
在bash中,您可以使用test(请参阅man test
)
例:
[[ -t 1 ]] && \
echo 'STDOUT is attached to TTY'
[[ -p /dev/stdout ]] && \
echo 'STDOUT is attached to a pipe'
[[ ! -t 1 && ! -p /dev/stdout ]] && \
echo 'STDOUT is attached to a redirection'
stdout
不是可以“写入文件”的东西。这是你write()
要做的。 less
不必根据其输出是文件,管道,套接字或块设备还是其他来做任何不同的事情。它不是tty才很重要,所以它的行为就像cat
。(我想您知道这一点,只是选择了错误的词来解释它,但是我想我会为其他读者指出这一点)。
less
不“说明” cat
下一个。cat
如果stdout不是tty,它的行为就像接下来的内容一样。
less
会继续进行下去,并使用一个TCGETS来获取终端尺寸或发现它不是tty,但显然我猜错了。
less
检查它stdout
是否是终端,并且行为是否类似cat
(将stdin复制到stdout直到EOF)。
此功能使您可以编写脚本或程序,这些脚本或程序始终通过其输出(例如,--help
输出)发送输出,less
同时仍允许轻松重定向到文件。如果some_command --fullhelp > help.txt
仍然等待stdin上的空格键翻阅文本或其他内容,它将很烂。一些命令(例如man
)检查自己的输出,以决定是否通过寻呼机发送其输出。如果您运行man ls > ls.txt
,它将永远不会调用您的$PAGER
。
less
如果您在向管道中添加更多阶段时也忘记从单行代码中对其进行编辑,则该类猫的行为很方便。
less
需要弄清楚终端尺寸(屏幕尺寸,要一次显示多少行)。将ioctl(2)
它使用在stdout
将在非终端返回ENOTTY,所以它不能避免反正处理非终端情况。 less
实际上isatty(3)
在检查端子尺寸之前使用,但是isatty
通过尝试仅tty的ioctl并检查是否没有错误来工作。
即使是一个简单的寻呼机more(1)
(至少是util-linux版本)也具有此功能,因为这可能是针对这种情况实现的最简单的理智行为。
请注意,当您将某些内容通过管道传送到 less
(例如grep foo bar.txt | less
)时,它确实必须打开/dev/tty
才能进行键盘输入。(您可以通过看到它echo foo | strace less
)。
bash script.sh
,bash script.sh | cat
,bash script.sh > file
,,看看你会得到什么输出。