SIGPIPE以降の潜在的なエラー

SIGPIPE以降の潜在的なエラー

CIサーバーでbashスクリプトを実行するとエラーコード141が発生しますが、ローカルでは再現できません。

PIPEFAIL数回検索した結果、エラー141がaを意味するように聞こえます。

set -o pipefail

スクリプトの上部にあります。

しかし、パイプラインが失敗する根本的なエラーコードが何であるかを知りたいです。失敗したコマンドのエラーコードを抽出する方法はありますか?それとも、パイプを使用せずにこれを達成するためにスクリプトを再構成する必要がありますか?

答え1

bashなので、PIPESTATUSを考えることができます。

command exit 1 | command exit 2 | command exit 3 | foobar; declare -p PIPESTATUS

見つかりません警告の後、次のfoobar値を取得する必要があります。PIPESTATUS

 declare -a PIPESTATUS=([0]="1" [1]="2" [2]="3" [3]="127")

答え2

$?141は、プロセスが信号13で終了したときに得られた値である。 Linuxでは、次のようになりますSIGPIPE(参照信号(7))。これは、プロセスがリーダーのないパイプに書き込もうとしたときに得られるものです。通常、パイプの戻り状態はその中の最後のプロセスの状態なので、この戻り値を見ることはできません。ただし、pipefail設定を使用すると、Bashは最後を返します。失敗する値。

$ (echo x; sleep 1; echo y) | head -1 >/dev/null ; echo $?
0

$ set -o pipefail
$ (echo x; sleep 1; echo y) | head -1 >/dev/null ; echo $?
141

関連情報