findで始まるコマンドの終了コードを取得するには?

findで始まるコマンドの終了コードを取得するには?

私は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終了しません。


コメントの質問について:

  1. for n; do ... ; done奇妙に見えますが、繰り返すことができる項目がなく、forループが暗黙的に繰り返されることに気付くと理解できます"$@"

  2. sh端の尾は$0殻に配置されますsh -c{}多くのパス名に置き換えられます。そこにない場合、sh最初のパス名は終了し、$0そこにないため、ループから選択されません$@$0通常、現在のインタプリタの名前が含まれます(シェルによって生成されたエラーメッセージに使用されますsh -c)。

おすすめ記事