1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Bash】headコマンドによってPIPESTATUS 141が発生する

Last updated at Posted at 2024-03-26

問題

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

参考文献

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?