我通常使用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
您可以使用-u
sed 的选项来最小化缓冲:
cat | sed -u '' | sed ''