我在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"在输出中,第二个没有写什么?
答案 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; }