shell管道如何处理无限循环

时间:2011-07-27 05:29:39

标签: linux bash unix shell pipe

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

cat file_with_long_content | less

工作正常,花花公子,但我很好奇的是,即使输出永无止境,仍然可以工作,考虑在inf.sh文件中使用以下脚本:

while true; do date; done

然后我跑

sh inf.sh | less

它仍然能够再次对结果进行分页,所以说管道流结果而不是在输出结果之前等待命令完成是否正确?

3 个答案:

答案 0 :(得分:7)

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

有关详细信息,请参阅pipe(7)手册。

答案 1 :(得分:1)

这是对的。 管道是溪流

您可以在很少的C代码行中编写自己的less工具版本。花点时间去做,包括对文件和管道进行简短的研究,然后你就可以理解回答你自己的问题了。)。

答案 2 :(得分:1)

亚历山大·桑德勒(Alexander Sandler)还提供了一篇内容丰富的文章,名为“如何更少地处理其输入”!

请参阅:Time taken by `less` command to show output