私はこのような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