“cat”和“less”之间的标准输入输入行为

“cat”和“less”之间的标准输入输入行为

当我发出 时cat,终端挂起等待标准输入输入。但是,当less发布时,我得到了Missing filename ("less --help" for help)。众所周知,less和都cat接受 stdin 输入。有什么不同?这如何反映在手册页中?

答案1

less当没有给出任何文件名参数时运行以下代码:

if (isatty(fd0))
{
    error("Missing filename (\"less --help\" for help)", NULL_PARG);
    quit(QUIT_OK);
}
return (edit("-"));

当标准输入是终端时它会抱怨。如果标准输入是普通文件或管道,那就可以了。

它可能这样做是因为它需要在每页末尾读取来自终端的响应,并且无法区分正在分页的数据和响应。

手册页中没有提到这一点。也许应该如此。

cat不分页其输出,也不读取来自终端的响应。就 stdin 作为终端而言,它没有任何限制。

答案2

我的猜测是less调用isatty(3)文件描述符 0。另一种选择是调用文件描述符 0 并解释和字段fstat(2)的值。无论哪种方式,重点是程序可以告诉有关文件描述符的信息,而 stdin 只是文件描述符 0。st_inost_rdev

至于为什么less退出和cat不退出,你需要看看这两个不同程序的目的。less是 GNU 寻呼机,是对 BSD 寻呼机的反应more(注意双关语名称)。对来自终端的输入进行分页并不完全有意义,但对来自管道的输入进行分页可能有意义。两者都可以是标准输入。编写特殊情况是less有意义的。对特殊情况进行编码cat是没有意义的,并且会降低其有用性。即使在 20 世纪 80 年代末,人们也有窗口系统,并且会键入cat > somefile然后将一大块文本粘贴到“somefile”中。

相关内容