管道和无限流如何工作?

管道和无限流如何工作?

我通常使用command1 | command2 | command3在Linux中使用很多,但大多数都是处理确定的内容。

当我使用无限流尝试此操作cat | sed '' | sed ''(希望模拟无限流)时,它不起作用,直到我用 终止它Ctrl-D。我可以通过使用解决问题cat | sed -e '' -e '',但我想知道为什么第一个不起作用。cat | cat | cat工作得很好。是不是有什么关系sed,如果是的话,那是什么问题?

我试图思考这个问题,我发现唯一不同的是,当我使用时,cat我按下了这个Enter键,它做了一些在第一个中没有发生的特殊事情sed ''

谁能告诉我如何使管道与无限蒸汽无缝工作?

答案1

管道将左侧命令的输出连接到右侧命令的输入。这与流的长度无关。然而,管道中的每个命令仍然有它自己的缓冲规则。如果您不在每个命令中触发它们,您将不会在最终输出中看到它们。

答案2

这基本上是重复的我对SO的回答。然而,由于stdbuf这里没有人提到这个命令,所以我觉得我也应该在这里添加它。

===============

基本上,只要数据在管道中可用,从管道读取的进程就可以逐字节地使用数据。然而,只要程序使用 libc 的 std io 函数,例如读、写等,libc 就会根据程序是否正在写入终端来缓冲这些程序的输入/输出。

默认情况下,如果程序正在写入终端,libc 将以行方式缓冲输出,如果它不写入终端,则它会按块方式缓冲。

在 Linux 上,有 glibc,您可以使用以下命令影响该行为stdbuf,如下所示:

stdbuf -oL cat | stdbuf -ioL sed '' | stdbuf -iL sed ''

我为命令使用基于行的输出缓冲区cat,为第一个sed命令使用基于行的输入和输出缓冲区,为最后一个sed命令使用基于行的输入缓冲区。

答案3

您可以使用-used 的选项来最小化缓冲:

cat | sed -u '' | sed ''

相关内容