3

ビルド スクリプトを実行していて、完了させたいのですが、問題が発生した場合にゼロ以外のリターン コードを返します。これまでのところ、これを行う唯一の方法は次のとおりです。

command1
rc1=$?

command2
rc2=$?

...

commandn
rcn=$?

exit $rc1 + $rc2 + ... + $rcn

pipefail に似ていますが、パイプされていないコマンドの場合、これを行うより良い方法はありますか?

更新:実際には合計は必要ありません(また、賢明だとも思いません)-エラー時にゼロ以外のリターンが返されるだけです。何か問題が発生した場合にビルドを失敗させたいスクリプトを実行していますが、検証チェックが失敗した場合でも実行可能な状態になるようにビルドを終了します。

4

6 に答える 6

2

それはおそらくあなたが望むものではありません

エラー コードは無意味になるため、おそらく追加したくないでしょう。代わりに、最初に遭遇したエラーで終了して表示するのがおそらく最善です。

&&これを行うには、 command をoperatorと一緒にチェーンします。

command1 \
&& command2 \
&& command3 \
|| echo "command failed: $?"

例えば:

➤ echo show && (exit 188) && echo noshow || echo "failed: $?"
show
failed: 188

あなたがしなければならない場合...

終了値を追跡する関数でコマンドをラップできます。

SUM_EXIT=0

wrap() {
  eval "$@"
  SUM_EXIT=$(($SUM_EXIT+$?))
}

wrap command1
wrap command2
wrap command3

exit $SUM_EXIT

これは (IMO) の完全に有効な使用法であることに注意してくださいeval。自分で書いたコマンドを実行します。改行を含む可能性のある奇妙なファイル名と引数には注意してください。よくわからない場合は、コマンドを完全に引用してください。

➤ wrap "(echo \"this is a 
newline containing string\" && exit 5)"
➤ echo $SUM_EXIT
5
于 2013-06-25T21:49:02.503 に答える
1

bash がオプションの場合。

「累積」リターン コードを追跡するには

declare -i rc=0
command1 || ((rc += $?))
command2 || ((rc += $?))
command3 || ((rc += $?))
exit $rc

戻りコードではなく、失敗したコマンドの数を追跡する必要がある場合

declare -i rc=0
command1 || ((++rc))
command2 || ((++rc))
command3 || ((++rc))
exit $rc
于 2013-06-25T22:04:19.347 に答える
0

zmoが提案したソリューションのわずかに簡略化されたバリアント:

((rc+=$?))

または、戻りコードがゼロと異なるかどうかだけに関心がある場合は、論理演算子を使用できます。

rc=$((rc || $?))
于 2013-06-25T21:56:39.437 に答える
0

多分これはあなたが探しているものです: 最初のコマンドが失敗した後もやりたくない場合set -eは、スクリプトの先頭で、最初のコマンドが終了するとすぐに終了させることができます (次のような制御構造の一部ではありません) if cmd) ゼロ以外で終了します。

シェルのマニュアルに詳細がすべて記載されています。私のボーン・シェルは次のように述べています。

 -e errexit
         Exit immediately if any untested command fails in non-interactive
         mode.  The exit status of a command is considered to be explic-
         itly tested if the command is part of the list used to control an
         if, elif, while, or until; if the command is the left hand oper-
         and of an ``&&'' or ``||'' operator; or if the command is a pipe-
         line preceded by the ! operator.  If a shell function is executed
         and its exit status is explicitly tested, all commands of the
         function are considered to be tested as well.
于 2013-06-25T21:48:22.217 に答える
0

これを行うためのより良い方法を求める場合 (ただし、それが最もエレガントで最善の方法ではないと確信しています)、代わりにそれを行うことができます。

rc=0

command1
rc=$(($rc+=$?))

command2
rc=$(($rc+=$?))

...

commandn
rc=$(($rc+=$?))

exit $rc
于 2013-06-25T21:49:50.523 に答える