多个unix管道无法正常工作

时间:2014-08-04 06:14:39

标签: unix pipe fifo netcat

第一个管道工作正常(打印" 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的类似问题,但没有得到答案)

1 个答案:

答案 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选项以切换到行缓冲。