問題
以下の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[@]}