我在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”,第二个写什么都没有?
我在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
行的目的是什么?我非常怀疑他们在这里有用。
这是因为在第二个命令你是管道一echo
的输出作为{ sleep 1s; kill 0; }
第二个不输出foo
,你只是没有看到它的输入,因为它是通过管道输送到你的第二个命令。
$ { { while true; do echo "foo" >> /tmp/f; done; kill 0; } | { sleep 1s; kill 0; } }
$ wc -l /tmp/f
56209
:
您可以通过重定向到一个文件证明这一点