web-dev-qa-db-ja.com

SIGPIPE後の根本的な障害

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

いくつか検索した後、エラー141がPIPEFAILを示しているように聞こえますが、

set -o pipefail

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

ただし、パイプが失敗する原因となった根本的なエラーコードを知りたいのですが。失敗したコマンドのエラーコードを抽出する方法はありますか?または、それを取得するためにパイプを使用しないようにスクリプトを再構築する必要がありますか?

1
kos

それは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")
1
Jetchisel

141は値$?は、LinuxではSIGPIPEであるシグナル13が原因でプロセスが終了した場合に取得します( signal(7) を参照)。これは、リーダーなしでパイプに書き込もうとした場合にプロセスが取得するものです。パイプの戻りステータスはパイプ内の最後のプロセスのステータスであるため、通常はその戻り値は表示されません。ただし、pipefailを設定すると、Bashは最後のfailing値を返します。

$ (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
0
ilkkachu