2012-10-22 20 views
7

私はset -eを使用してエラー時に中止します。Bashはエラーを無視してリターンコードを取得します

しかし、私はエラーを無視したいと誤って私はエラーの私は関数のリターンコードをしたい。

例:

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

しかし、それはリターンコードを動作していないが、常に真の原因である|| true

do_workエラー時にリターンコードを取得するにはどうすればよいですか?

+0

その呼び出しの直前にエラーで終了するのを無効にしないのはなぜですか? – Mat

+0

@Mat yaありがとうございます。しかし、知識の目的のために私はリターンコードをキャプチャする方法はありますか? –

答えて

6
do_work || { 
    status=$? 
    echo "Error" 
} 
4

あなたはサブシェルのショートカットを使用できます。これは

4

一つの方法は、パイプを使用することです)=を助け

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

希望を、-eは、パイプの一番右の結果を見ます:

set -e 

do_work | true 

retn=${PIPESTATUS[0]} 
if (($retn != 0)) 
then 
    echo "Error $retn" 
fi  
echo Ending 

は、私はちょうどexit 42を行なったし、次の出力を得たシンプルなdo_work書きました

Error 42 
Ending 

PIPESTATUS配列は、各要素がパイプラインの各部分の戻りコードを与えるBashによって維持されます。各コマンドで上書きされるので、すぐにキャプチャする必要があります(したがって$retn)。

もちろん、do_workにパイプが含まれている場合は、この問題が発生する可能性があります。彼らはdo_workが成功した場合、未定義される変数に対するテストにつながるので、ここで与えられた回答のいくつかの

1
do_work || status=$? 
if [ $status -ne 0 ] 
then 
    echo "Oh no - Fail whale $status has arrived" 
fi 
4

は、正しくありません。

我々は同様に成功したケースをカバーする必要があるので、答えは次のとおりです。その後、

set -eu 
do_work && status=0 || status=1 

それがテキストで言うので、ポスターの質問は少しあいまいです「エラー時に私はコードを返したい」が、我々は時間かもしれませんが印刷された値は123である。このコードでは

set -e 

do_work() { 
    return 0 
} 

status=123 

do_work || status=$? 
echo $status 

はなく、0:コードは

を説明するために、「私は常にリターンコードをしたい」を意味し、ここに問題のあるコードですのためのope。

関連する問題