为什么管道订单很重要?

时间:2012-12-17 15:44:44

标签: bash pipeline

我在bash中有两个程序:

{ { sleep 1s; kill 0; } | { while true; do echo "foo"; done; kill 0;} }

{ { while true; do echo "foo"; done; kill 0; } | { sleep 1s; kill 0; } }

(只是改变了顺序)。

第一个如何写出很多" foo"在输出中,第二个没有写什么?

3 个答案:

答案 0 :(得分:2)

通过管道连接两个进程会将输出从第一个重定向到第二个。因此,连接将输出写入不执行任何输出的进程的进程意味着不会发生输出。

相比之下,将一个没有任何作用的进程连接到生成输出的进程,后者将继续像往常一样生成输出。

顺便说一句,kill 0行的目的是什么?我非常怀疑它们在这里是有用的。

答案 1 :(得分:2)

第二个输出foo,你只是看不到它,因为它是用你的第二个命令输出的。

您可以通过重定向到文件来证明这一点:

$ { { while true; do echo "foo" >> /tmp/f; done; kill 0; } | { sleep 1s; kill 0; } }
$ wc -l /tmp/f
56209

答案 2 :(得分:0)

那是因为在第二个命令中,您将echo的输出作为{ sleep 1s; kill 0; }

的输入。

What is a simple explanation for how pipes work in BASH?