第一个管道工作正常(打印" c"):
echo "a" | sed 's/a/b/' | sed 's/b/c/'
这个不符合我的预期(当我将#34; a"加入我的fifo时,没有任何内容被打印出来):
mkfifo fifo;
cat fifo | sed 's/a/b/' | sed 's/b/c/'
但是,如果我删除第二个" sed"来自后一个管道的命令,我确实得到了一个" b"打印。我认为我对管道和重定向的理解必须过于简单化。 有人可以向我解释如何修复第二种情况,以便我可以对fifo的内容运行两个连续的命令吗?
(注意这不是特定于fifo的问题,netcat也会出现同样的行为。我发布了一个关于netcat的类似问题,但没有得到答案)
答案 0 :(得分:1)
缓冲。 sed
正在改变它的缓冲,具体取决于输出是否为tty。当你有两个sed时,第一个确定它的输出不是tty,所以它是缓冲。所以当你有:
cat fifo | sed 's/a/b'
sed没有缓冲,因为它的输出是tty所以你看到了数据但是当你有:
cat fifo | sed 's/a/b' | sed 's/c/d'
第一个sed是缓冲数据。根据您运行的特定sed,有不同的方法可以禁用缓冲。 GNU sed具有--unbuffered
选项,而BSD sed具有-l
选项以切换到行缓冲。