2013-04-18 6 views
22

複数のコマンドを順番に実行するために使用するbashスクリプトがあります。シーケンスはゼロ以外の終了コードを返します。私はそれのためのwaitコマンドがあることを知っていますが、私はそれを使用する方法を理解しているか分からない。複数のコマンドをbashスクリプトで順番に実行し、少なくとも1つでも失敗した場合は失敗する

UPDスクリプトは次のようになります。

#!/bin/bash 
command1 
command2 
command3 

すべてのコマンドはフォアグラウンドで実行されます。すべてのコマンドは、前のコマンドが戻った出口状況に関係なく実行する必要があります(したがって、最初のエラー時に終了するようにしてはいけません)。基本的には、すべての終了ステータスを収集し、それに応じてグローバル終了ステータスを返す必要があります。

+0

おそらくこれはhttp://stackoverflow.com/questions/3474526/stop-on-first-errorがあなたが望むものですか? –

+0

@Marian Theisenいいえ、スクリプトは最初のエラーで停止してはなりません。前のコマンドが返すステータスに関係なく、スクリプト内のすべてのコマンドを実行する必要があります。 –

答えて

28

はちょうどそれを実行します。コマンドのいくつかが失敗した場合の状態のそれは返すべき

EXIT_STATUS=0 
command1 || EXIT_STATUS=$? 
command2 || EXIT_STATUS=$? 
command3 || EXIT_STATUS=$? 
exit $EXIT_STATUS 

わかりません。

+1

最初のエラーの後に停止したい場合は、 "set -e" – mcoolive

7

シーケンスでパイプを意味する場合、pipefailをスクリプト内にset -o pipefailのように設定する必要があります。 man bashから:pipefailオプションが有効になって でない限り

パイプラインの戻りステータスは最後のコマンド、 の終了ステータスです。 pipefailが有効になっている場合、パイプラインの戻りステータスは最後の(最も右の) コマンドの値がゼロ以外のステータスで終了するか、またはすべてのコマンドが正常に終了すると0になります。予約されている場合 言葉!パイプラインに先行する場合、そのパイプラインの終了ステータスは、前述の出口 ステータスの論理否定です。シェルは、 が値を返す前に、パイプライン内のすべてのコマンドが終了するのを待ちます。

単にコマンドを意味する場合は、各コマンドの終了ステータスを確認し、終了ステータスがゼロ以外の場合はフラグを設定してください。これは、コマンドが失敗した場合にのみEXITを設定するには、論理演算子OR ||を使用しています

#!/bin/bash 

EXIT=0 
grep -q A <<< 'ABC' || EXIT=$? # Will exit with 0 
grep -q a <<< 'ABC' || EXIT=$? # Will exit with 1 
grep -q A <<< 'ABC' || EXIT=$? # Will exit with 0 
echo $EXIT      # Will print 1 
exit $EXIT      # Exit status of script will be 1 

:あなたのスクリプトは次のようにフラグの値を返しています。複数のコマンドが失敗した場合、最後に失敗したコマンドの終了ステータスはスクリプトによって返されます。

これらのコマンドがバックグラウンドで実行されていない場合は、waitはここでは関係ありません。

4

あなたが失敗したコマンドどの知りたいではなくneccessarilyそのリターンコードは、あなたが使用することができた場合:

#!/bin/bash 

rc=0; 
counter=0; 

command1 || let "rc += 1 << $counter"; let counter+=1; 
command2 || let "rc += 1 << $counter"; let counter+=1; 
command3 || let "rc += 1 << $counter"; let counter+=1; 

exit $rc 

これは失敗したコマンドに対応するビットを設定するために、bashでビットシフトを使用しています。

したがって、最初のコマンドが失敗した場合、戻りコードは1(= 2^0)、3番目が失敗した場合は8(= 2^3)の戻りコードが得られます。 3番目のコマンドが失敗した場合、戻りコードとして9が得られます。

関連する問題