第一个管道运行正常(打印“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 unbuffer
和man stdbuf
。
如果是 shell 脚本,则默认情况下应取消缓冲:当命令在脚本中创建输出并退出时,输出将被刷新。否则,请在 shell 脚本中使用 unbuffer。
有关背景信息,请参阅stdio 缓冲概述。