set -e
エラーで中止するために使用しています。
しかし、特定の1つの関数については、エラーを無視し、エラーが発生した場合は、関数のリターンコードが必要です。
例:
do_work || true
if [ $? -ne 0 ]
then
echo "Error"
fi
しかし、それは動作しません。戻りコードは常に真です|| true
エラー時にdo_workのリターンコードを取得する方法は?
set -e
エラーで中止するために使用しています。
しかし、特定の1つの関数については、エラーを無視し、エラーが発生した場合は、関数のリターンコードが必要です。
例:
do_work || true
if [ $? -ne 0 ]
then
echo "Error"
fi
しかし、それは動作しません。戻りコードは常に真です|| true
エラー時にdo_workのリターンコードを取得する方法は?
do_work
ここに示されている回答のいくつかは、成功した場合に未定義になる変数に対するテストにつながるため、正しくありません。
成功したケースもカバーする必要があるので、答えは次のとおりです。
set -eu
do_work && status=0 || status=1
ポスターの質問は、テキストで「エラー時にリターンコードが必要です」と書かれているため、少しあいまいですが、コードは「常にリターンコードが必要です」を意味します。
説明のために、ここに問題のあるコードがあります:
set -e
do_work() {
return 0
}
status=123
do_work || status=$?
echo $status
このコードでは、出力される値は123であり、期待どおりの0ではありません。
サブシェルショートカットを使用できます。
( set +e; do_work )
if [ $? -ne 0 ]
then
echo "Error"
fi
これがお役に立てば幸いです=)
do_work || {
status=$?
echo "Error"
}
1つの方法は、パイプを使用することです。パイプ-e
の右端の結果のみを確認します。
set -e
do_work | true
retn=${PIPESTATUS[0]}
if (( $retn != 0 ))
then
echo "Error $retn"
fi
echo Ending
私は単純なものを書きましたdo_work
が、それexit 42
は次の出力を取得しました。
Error 42
Ending
配列はBashによって維持され、PIPESTATUS
各要素はパイプラインの各部分のリターンコードを提供します。$retn
コマンドごとに上書きされるため、一度にキャプチャする必要があります(したがって)。
もちろんdo_work
、パイプ自体が含まれている場合、これは問題になる可能性があります。
do_work || status=$?
if [ $status -ne 0 ]
then
echo "Oh no - Fail whale $status has arrived"
fi