9

set -eエラーで中止するために使用しています。

しかし、特定の1つの関数については、エラーを無視し、エラーが発生した場合は、関数のリターンコードが必要です。

例:

do_work || true 
 if [ $? -ne 0 ] 
  then
   echo "Error"
  fi  

しかし、それは動作しません。戻りコードは常に真です|| true

エラー時にdo_workのリターンコードを取得する方法は?

4

5 に答える 5

10

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ではありません。

于 2015-08-18T22:41:26.943 に答える
8

サブシェルショートカットを使用できます。

( set +e; do_work )
 if [ $? -ne 0 ]
  then
   echo "Error"
  fi

これがお役に立てば幸いです=)

于 2012-10-22T11:57:27.690 に答える
8
do_work || {
    status=$?
    echo "Error"
}
于 2012-10-22T15:17:26.883 に答える
4

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、パイプ自体が含まれている場合、これは問題になる可能性があります。

于 2012-10-22T12:42:14.167 に答える
1
do_work || status=$?
if [ $status -ne 0 ]
then
    echo "Oh no - Fail whale $status has arrived"
fi
于 2012-10-22T15:33:44.547 に答える