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