端末で次のコマンドを実行するとします。
this-command-doesnt-exist-and-closes-with-code-127 | jq ''
実行したら、パイプの最初のコマンドの終了コードを知りたいですecho $?
。私は次のようにstderrをリダイレクトすることを検討しました。0
jq
this-command-doesnt-exist-and-closes-with-1 2>&1 | jq ''
if [ $? != 0 ]; then
echo "I got an error"
fi
そう意味のないメッセージを送りましたjq
。問題は解決されますが、正しい解決策ではないようです。パイプからコマンドのエラーコードをどのように取得できますか?
答え1
使用している場合は、次のものをbash
使用できますset -o pipefail
。
$ set -o pipefail
$ this-command-doesnt-exist-and-closes-with-code-127 | jq ''
bash: this-command-doesnt-exist-and-closes-with-code-127: command not found...
$ echo $?
127
~からバッシュのマニュアルページ:
パイプ故障
設定されている場合、パイプラインの戻り値は、ゼロ以外の状態で終了した最後の(最も右側の)コマンドの値、またはパイプラインのすべてのコマンドが正常に終了した場合は0です。このオプションはデフォルトで無効になっています。