集約スクリプトの下付き文字のステータスコード

集約スクリプトの下付き文字のステータスコード

私はこのようなbashスクリプトを持っています

#!/bin/bash

do-this parm someotherparam
do-something-else $varz $(commands)
and-also-do-this -something
finally-do-something-different -yes

上記の個々のコマンドすべてが0を返す場合は、このスクリプトが終了ステータス0を返すようにしたいと思います。単一のコマンドがゼロ以外の値を返す場合は、ゼロ以外の値を返したいと思います。ゼロでない限り、ゼロ以外の値が何であるかは関係ありません。

明らかに、各行以降の状態を確認すると、冗長であっても簡単に目標を達成できます。私は初めてbashに触れたので、これを書く慣用的な方法があるかどうか疑問に思いました。

注:終了状態に関係なく、すべてのコマンドを実行したいです。それ以外の場合は、次のようになります。これ働く

答え1

#!/bin/bash

err=0

do-this parm someotherparam             ; (( err |= $? ))
do-something-else $varz $(commands)     ; (( err |= $? ))
and-also-do-this -something             ; (( err |= $? ))
finally-do-something-different -yes     ; (( err |= $? ))

これは変数を0に初期化し、err各コマンドの後に(ビットごとのOR)errに設定します。ゼロ以外の終了状態でコマンドが終了すると、値はゼロ以外の数値に設定され、スクリプトが終了するまでゼロ以外のままです。$err | $?err

必要に応じて、exit "$err"スクリプトの最後に 。

同じ結果を得るより受動的な方法:

err=0
trap '(( err |= $? ))' ERR

# (rest of original script)

errこれは、コマンドがゼロ以外の終了状態で終了するたびに、上記と同じ方法でエラートラップを設定します。トラップは、スクリプトを終了するerrexitシェルオプション()とset -e同じ条件で実行されます。作業を簡単にするために、err=1必要に応じてトラップを設定できます。

コードブロック後にトラップをキャンセルするには、次のようにします。

trap - ERR

関連情報