为什么管道顺序很重要



>我在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",而第二个什么都不写?

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

相比之下,将不执行任何操作的进程连接到生成输出的进程,后者将照常继续生成输出。

顺便问一下,kill 0线的目的是什么?我非常怀疑它们在这里是否有用

第二个确实输出foo,你只是看不到它,因为它被管道传输到你的第二个命令。

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

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

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

关于管道在 BASH 中如何工作的简单解释是什么?

最新更新