私はTravis-CIでFindを使ってプログラムで特定のファイル形式をチェックしています。 (正確に言えばシェルチェックです。)
ただし、find
それによって実行されたコマンド/サブシェルの終了コードを使用すると、「メインスクリプト」に渡されず、自然に破棄されます。
たとえば、以下はfindコマンドです。
find . -type f -iname "*.sh" -exec sh ./testScripts.sh "{}" \;
./testScripts.sh
テスト結果に応じて、0または> = 1で終了することがあります。
正しい終了コードで正しく終了しますが、testScripts.sh
コマンドfind
の終了コードは常に「0」です。私が欲しいのはファイル/実行エラー、このエラーはTravis-CIに「伝播」されました。
どうすればいいですか?
ベストアンサー1
コメントでStephen Kittの提案を使用してください。
find . -type f -iname "*.sh" -exec sh -c 'for n; do ./testScripts.sh "$n" || exit 1; done' sh {} +
これにより、sh -c
スクリプトはゼロ以外の終了状態でできるだけ早く終了しますtestScript.sh
。つまり、find
ゼロ以外の終了状態でも終了します。
プラス記号で終わると、デフォルトのパス名を評価するパス名はセットとして集計され、ユーティリティは同様にセットごとに1回呼び出されます
xargs(1)
。 ゼロ以外の終了状態で通話が終了すると、この操作find
も最終的に行われます。しかし、これは早期にfind
終了しません。
コメントの質問について:
for n; do ... ; done
奇妙に見えますが、繰り返すことができる項目がなく、for
ループが暗黙的に繰り返されることに気付くと理解できます"$@"
。sh
端の尾は$0
殻に配置されますsh -c
。{}
多くのパス名に置き換えられます。そこにない場合、sh
最初のパス名は終了し、$0
そこにないため、ループから選択されません$@
。$0
通常、現在のインタプリタの名前が含まれます(シェルによって生成されたエラーメッセージに使用されますsh -c
)。