2012-12-17 231 views
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」,第二個寫什麼都沒有?

回答

2

通過管道連接兩個進程將輸出從第一個輸出重定向到第二個輸入。因此,連接將輸出寫入不執行輸出意味着沒有輸出的進程的進程。

相比之下,連接一個對生成輸出的進程沒有任何作用的進程,後者將像往常一樣繼續生成輸出。

順便說一下,kill 0行的目的是什麼?我非常懷疑他們在這裏有用。

2

第二個不輸出foo,你只是沒有看到它的輸入,因爲它是通過管道輸送到你的第二個命令。

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

您可以通過重定向到一個文件證明這一點

相關問題