2016-09-09 3 views
2

に失敗した場合、私は次のように作られたbashスクリプトscript.shを持って終了コード> 0を返しますか否か。bashは全体のスクリプトを実行するが、任意の中間ジョブは

step3.shが失敗した場合、適切な終了コードが得られますが、step1.shまたはstep2.shのいずれかが失敗し、step3.shが成功した場合、status = 0になります。これは理想的ではありません。

は、私は中間のステップのいずれかが失敗した場合、スクリプトは失敗にするために私のスクリプトの先頭に

set -e 

を使用することができます知っているが、それは私が欲しいものではありません。

各中間スクリプトを実行するのに使用する簡単なオプションがあるかどうかを知りたいのですが(いずれかが失敗しても)、終了コードが0より大きい場合は、各個別の終了コードを手動で入力します。あなたはこのように行うことができます

+0

は、なぜあなたは '-e'設定を使用したくない、あなたが望む期待される動作は何ですか? step2.sh'が失敗した場合、 'step3.sh'を実行し続けるべきですか? – ffledgling

+0

各中間ステップが失敗する方法については、整数の別のビットを設定する –

+0

@ffledglingはい各中間ステップを実行し続ける必要があります – lucacerone

答えて

4

をすることはできトラップエラー:

#!/bin/bash 

echo "test start." 

trap 'rc=$?' ERR 

./error.sh 
./script2.sh 

echo "test done." 
return ${rc} 

トラップの動作の詳細については、trapを参照してください。絶対的な基本に煮詰め

0

#!/bin/bash 

# array with all the scripts to be executed 
arr=(./step1.sh ./step2.sh ./step3.sh) 

# initialize return status to 0 
ret=0 

# run a loop to execute each script 
for i in "${arr[@]}"; do 

    echo "running $i" 
    bash "$i" 
    ret=$((ret | $?)) # return status from previous step bitwise OR with current status 

done 

echo "exiting with status: $ret" 

exit $ret 
+3

これは本質的に各終了コードを手動で追跡しているわけではありません何をする? – ffledgling

+1

私はOPが各ステップの終了ステータスに関係なくすべてのステップを実行したいと考えていますが、ステップが失敗した場合でも失敗して終了したいと考えています。 – anubhava

+1

@anubhavaこれはまさに私がやりたいことです。しかし、私は手動で小切手をスキップすることができる任意のオプションがあるかどうかを知りたがっていました。とにかく私はあなたのソリューションが好きです! – lucacerone

0

は、私はあなたがすべての終了コードを維持する必要がしたくなかった述べ知っているが、それは配列で行うには実際には非常に簡単です:

declare -a rcs 
./step1.sh ; rcs+=($?) 
./step2.sh ; rcs+=($?) 
./step3.sh ; rcs+=($?) 

その後、ループ内の配列を一歩進んで、最初に(または最大、最後、平均、合計など)エラーコードを探します。 最大エラーを取得するために、同様に

for ((idx = 0; idx < ${#rcs[@]}; idx++)); do 
    [[ ${rcs[$idx]} -ne 0 ]] && return ${rcs[$idx]} 
done 
return 0 

:以下のコードでは、遭遇した最初エラーを返すために、これを行う方法を示して

rc=0 
for ((idx = 0; idx < ${#rcs[@]}; idx++)); do 
    [[ ${rcs[$idx]} -gt $rc ]] && rc=${rcs[$idx]} 
done 
return $rc 
+0

あなたはコードの難読化コンテストのためにこれを提出していますか? – dood

+0

@ dood:nice one。残念なことに、ほとんどの人は真のパワーを実現していない、「bash」の最小部分しか使用していません。うまくいけば、C知識のばらつきを持つ誰でも理解できるはずです。そうでない場合は、良い学習機会です:-) – paxdiablo

0

rc=0 
./step1 || rc=$? 
./step2 || rc=$? 
./step3 || rc=$? 
exit $rc 
+0

OPは、明らかに「個々の終了コードを手動で追跡する」ことは望ましくありません。 – dood

+0

私は '.sh'拡張子を残しておきました。あなたのタグによると、これは 'sh'スクリプトではなく、Bashスクリプトです。拡張機能をハードコーディングすると、コマンドを別の言語での再実装で置き換えることはできません(同じファイル名を維持し、誠実さを保ちます)。 – tripleee

+0

@dood私たちは追跡していません、エラーの場合は上書きします。しかし、ええ、私はあなたの答えを既にupvoted( - : – tripleee

関連する問題