コマンドが失敗するとスクリプトは失敗しますが、いずれにせよすべてのコマンドを実行します。

コマンドが失敗するとスクリプトは失敗しますが、いずれにせよすべてのコマンドを実行します。

ソースコードのカスタムリンターであるスクリプトでいくつかのコマンドを実行する必要があります。各実行はレポートを生成し、ルールに違反すると終了コード 1 で失敗します。レポートの生成に失敗する前にすべてのコマンドを実行し、ゼロ以外の終了コードでコマンドが失敗した場合は失敗する必要があります。最初のエラーが発生した時点でスクリプトが存在したため、スクリプトは機能しません。

lint ./module1/src/main/java && lint ./module2/src/main/java && lint module3/src/main/java

今、私は次のスクリプトを使用しています。

lint ./module1/src/main/java
code1="$?"
lint ./module2/src/main/java
code2="$?"
lint ./module3/src/main/java
code3="$?"

if [[ "$code1" != "0" || "$code2" != "0" || "$code3" != "0" ]]; then
  exit 1
fi

しかし、過度に複雑でスケーラブルではないようです(追加変数を追加して次のコマンドを確認する必要があります)。

このスクリプトをもう少しエレガントにできますか?

答え1

すべてのテストを完了し、最終的な完全なステータスコードを返すには、この方法でコーディングする必要があります。これは一つの方法です

#!/bin/bash
#
ss=0

lint ./module1/src/main/java || ((ss++))
lint ./module2/src/main/java || ((ss++))
lint ./module3/src/main/java || ((ss++))

exit $ss

作成されると、失敗したテストの数に対応する終了コードで失敗します。それでもtrue / false(0/0ではない)をテストできますが、1どちらの場合も正確に終了するコードが必要な場合以上テストが失敗し、完全((ss++))に変更されましたss=1

答え2

少しハッキングですが、xargsこの目的に使用できます。デフォルトでは、すべてのコマンドを実行し、いずれかのコマンドが失敗すると、ステータス123で終了します。

ここでは3つのコマンドを実行しましたが、すべて失敗しましたが実行されました。

echo '
echo 1 && exit 1
echo 2 && exit 1
echo 3 && exit 1
' | xargs -d "\n" -L1 -I{} bash -c {}

コマンドは終了ステータス123(GNU xargs)で終了しますが、次のように出力して3つのコマンドがすべて実行されたことを示します。

1
2
3

同様の命令セットは全て状態0で正常に終了する。

echo '
echo 1 && exit 0
echo 2 && exit 0
echo 3 && exit 0
' | xargs -L1 -I{} bash -c {}

予想どおり、ここで終了状態は0です。

関連情報