壳管如何处理无限循环



当我需要限制shell命令输出时,我使用less对结果进行分页:

cat file_with_long_content | less

工作得很好,但我好奇的是,即使输出永远不会结束,仍然可以工作,考虑在inf.sh文件中使用以下脚本:

while true; do date; done

然后运行

sh inf.sh | less

并且它仍然能够再次分页结果,所以说管道流式处理结果而不是等待命令在输出结果之前完成是正确的吗?

是的,当您运行sh inf.sh | less时,这两个命令是并行运行的。由第一个进程写入管道的数据被(由内核)缓冲,直到第二个进程读取。如果缓冲区已满(即,如果第一个命令写入管道的速度比第二个命令读取的速度快),则下一个写操作将阻塞,直到有更多的空间可用。从空管道中读取数据时也会出现类似的情况:如果管道缓冲区为空,但输入端仍然打开,则读取将阻塞以获取更多数据。

参见管道(7)手册

正确。管道是流

您可以编写自己版本的less工具,只需很少的C代码行。花点时间去做,包括对文件和管道的简短研究,你就会理解如何回答你自己的问题,甚至更多:)

最新更新