問題
以下のbashスクリプトを実行すると、
seq 1 100000 | head ; echo ${PIPESTATUS[@]}
次のように出力される。
(全体としての終了ステータスは0です。)
1
2
3
4
5
6
7
8
9
10
141 0
原因
head が必要とする行数を読み込んだ後に終了するため、seq からの追加の出力がパイプを通じて head に送信されることなく破棄されます。
これにより seq コマンドは SIGPIPE シグナルを受信し、結果として PIPESTATUS[0] は 141 (128 + SIGPIPE のシグナル番号13) を返します。
引数なしの head が必要とする行数は10行ですが、10行より多少多いだけなら seq による出力が間に合って PIPESTATUS[0] は 0 になります。
環境によりますが、1000行くらいなら PIPESTATUS[0] は 0 になります。
# PIPESTATUS[0] はおそらく 0 になる。
seq 1 1000 | head ; echo ${PIPESTATUS[@]}
dd で /dev/null へ捨てることで、PIPESTATUS[0] を 0 にできます。
(最後まで実行するため、実行時間が長くかかります。)
# 実行時間はかかるが、 PIPESTATUS[0] は 0 になる。
seq 1 100000 | (head; dd status=none of=/dev/null) ; echo ${PIPESTATUS[@]}