2013-07-28 33 views
1

什麼時候管道程序終止,誰控制這個終止過程?我讀過Bash: why the pipe is terminated?,但它僅部分涵蓋了這個問題。在嘗試回答這個問題之後,我自己做了幾個例子來看看他們的結果。而這一次我不明白:(a.sh):在bash中終止管道程序的策略是什麼?

#!/bin/bash 

echoerr() { echo [email protected] 1>&2; } 

echoerr a.sh started 

sleep 1 
echo 1 

sleep 1 
echo 2 

sleep 1 
echo 3 

sleep 1 # Line 1 
echo 4 # Line 2 

echoerr a.sh finished 

我運行它./a.sh | head -3。輸出是:

a.sh started 
1 
2 
3 

從我理解,./a.shSIGPIPE信號終止的輸出,因爲需要沒有更多的數據讀取前3行輸入的後。但是,當我刪除要麼線1 要麼線2的輸出變化如下:

a.sh started 
1 
2 
3 
a.sh finished 

所以我的問題是:

  • 什麼是終止管道方案的政策?
  • 爲什麼第1行會影響程序行爲?
  • 爲什麼第2行會影響程序行爲?

回答

2

正如你所說,如果shell腳本試圖寫入封閉的管道,它將會死亡。如果沒有,它不會。

如果刪除第二行,a.sh不會在echo 3之後嘗試寫入其stdout,因此它沒有任何理由失敗。

每次運行測試時,刪除第一行可能不會獲得相同的結果。有一個時間問題。如果最後兩個echo語句在head嘗試從其輸入讀取(並且因爲它已達到3行而終止)之前處理,則a.sh將不會收到損壞的管道錯誤。如果時間是head在兩個echo之間讀取,則a.sh將得到管道錯誤並死亡。