【问题标题】:how shell pipe handles infinite loop壳管如何处理无限循环
【发布时间】:2011-07-27 05:29:38
【问题描述】:

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

cat file_with_long_content | less

它工作得很好而且花花公子,但我很好奇的是,即使输出永无止境,仍然工作得更少,考虑在inf.sh 文件中包含以下脚本:

while true; do date; done

然后我跑

sh inf.sh | less

而且它仍然可以再次对结果进行分页,所以说管道流式传输结果而不是等待命令完成后再输出结果是否正确?

【问题讨论】:

    标签: linux bash unix shell pipe


    【解决方案1】:

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

    详情请参阅pipe(7) 手册。

    【讨论】:

      【解决方案2】:

      没错。 管道是流

      您可以用几行 C 代码编写自己的 less 工具版本。花点时间做这件事,包括对文件和管道的简短研究,你就会明白回答你自己的问题等等:)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-21
        • 2012-04-07
        • 2021-08-21
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多