1

我在 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”而第二个什么都不写怎么可能?

4

3 回答 3

2

第二个确实 output foo,您只是看不到它,因为它通过管道传输到您的第二个命令。

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

$ { { while true; do echo "foo" >> /tmp/f; done; kill 0; } | { sleep 1s; kill 0; } }
$ wc -l /tmp/f
56209
于 2012-12-17T15:59:55.880 回答
2

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

相比之下,将一个不做任何事情的进程连接到一个生成输出的进程,后者将继续像往常一样生成输出。

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

于 2012-12-17T15:56:50.900 回答
0

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

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

于 2012-12-17T15:57:27.193 回答