サブコマンド内でコマンドが失敗すると失敗します。

サブコマンド内でコマンドが失敗すると失敗します。

ディレクトリリストからコマンドを実行したいですgradle --build-cache。また、ディレクトリは "Project"文字列で始まる必要があり、 "Test"で終わらないでください。次のコマンドを使用してこれを正常に実行しました。

find . -maxdepth 1 -type d \( ! -name . \) -name "Project*" ! -name "*Test*" -exec sh -c "cd '{}' && pwd && gradle --build-cache" \;

しかし、私の問題は、gradleコマンドが失敗する可能性があることです。コマンドのみを実行すると「exit 1」が返されますが、ディレクトリコマンドの1つが失敗すると、失敗を返さずにスクリプトが続行されます。最後に、ループは成功を返しますexit 0...

gradleコマンドが失敗したときにループの実行を停止して通常のコマンドに戻る方法はexit 1

ありがとうございます:)

答え1

同様の質問です。https://apple.stackexchange.com/questions/49042/how-do-i-make-find-fail-if-exec-fails。私はあなたの目標を達成する可能性が最も高い2つの便利な方法をリストしました。

最も簡単な方法はを使用することですが、xargsこれはコマンドが見つかるパスにスペースがない場合にのみ機能しますfind

find … -print0 | xargs -0 -n1 invalid_command

古いBash(4.xx未満)を使用している場合は、再帰ワイルドカードの検索と使用を削除するか、再帰検索を直接実装することもできます(ディレクトリツリーが問題を引き起こすのに十分深いかどうか疑問です)。

shopt -s globstar
set -e
for x in **/*.xml; do invalid_command "$x"; done

または、1行で作成する必要がない場合は、まずすべてのディレクトリを見つけて一時ファイル(mktempそのファイル用)に保存し、リストを使用して必要なすべての操作を実行できます。さらにフィルタリングするには、その項目に対してコマンドを実行します。

答え2

最後のコマンドがエラーで終了したかどうかをテストし、その行に追加してexitコマンドif [[ $? != 0 ]] ; then exit ; fiを実行できます。

提供されたコードスニペットが大きなスクリプトの一部である場合、スクリプトは完全に終了します。これを使用できるように、fororループで書き直すことをお勧めします。whilebreak

答え3

楽しみにしてここにfind唯一の答えがあります。 POSIX機能だけではこれを行うことはできないようですが、findすでにいくつかのGNUismを使用しているので、基本機能を利用できます-quit

$ find -exec command {} \; -o -quit

これは失敗するとfindすぐに終了しますcommand(つまり、ゼロ以外の終了コードを返します)。これでfind、ゼロ以外の状態で強制終了するには、の操作を実行する必要があります-quit

$ find -exec command {} \; -o -fprint /dev/full -quit

すべての書き込みが/dev/full失敗するためです。次のエラーメッセージが表示されます。

find: ‘/dev/full’: No space left on device

2>/dev/null必要に応じてフィルタリングできます。

使用する場合NetBSD ルックアップ、次のようにすることができます。

$ find -exec command {} \; -o -exit 1

関連情報