多个UNIX管道无法正常工作(Multiple unix pipes not working)

2019-10-20 15:13发布

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

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



文章来源: Multiple unix pipes not working