ローカルで再現できないCIサーバーでbashスクリプトを実行すると、エラーコード141が発生します。
いくつか検索した後、エラー141がPIPEFAIL
を示しているように聞こえますが、
set -o pipefail
スクリプトの上部にあります。
ただし、パイプが失敗する原因となった根本的なエラーコードを知りたいのですが。失敗したコマンドのエラーコードを抽出する方法はありますか?または、それを取得するためにパイプを使用しないようにスクリプトを再構築する必要がありますか?
それは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")
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