多个 unix 管道不起作用

多个 unix 管道不起作用

第一个管道运行正常(打印“c”):

echo "a" | sed 's/a/b/' | sed 's/b/c/'

这个并没有达到我期望的效果(当我将“a”输入到我的 fifo 中时没有打印任何内容):

mkfifo fifo;
cat fifo | sed 's/a/b/' | sed 's/b/c/' 

但是,如果我从后一个管道中删除第二个“sed”命令,则会打印出“b”。我想我对管道和重定向的理解一定过于简单了。有人能向我解释如何解决第二种情况吗这样我就可以对 fifo 的内容运行两个连续的命令?

(请注意,这不是 fifo 特有的问题,netcat 也会出现同样的问题。我发布了一个类似的问题关于 netcat 但没有得到答案)

答案1

使用sed 的-u( --unbuffered) 选项,这样它会写入其输出,而不是先收集它以便稍后进行快速、大量的写入。

cat fifo | sed -u 's/a/b/' | sed -u 's/b/c/'

cat始终是无缓冲的。

如果不是关于sed,而是一些带有输出缓冲的程序,但没有禁用它的选项,那么有一些工具可以帮助强制关闭缓冲 - 请参阅man unbufferman stdbuf

如果是 shell 脚本,则默认情况下应取消缓冲:当命令在脚本中创建输出并退出时,输出将被刷新。否则,请在 shell 脚本中使用 unbuffer。

有关背景信息,请参阅stdio 缓冲概述

相关内容