我在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
:
您可以通過重定向到一個文件證明這一點