なぜ以下が表示されますか?
$ find -not -exec bash -c 'foo' \; -quit
bash: foo: command not found
$ echo $?
0
これは私が使っている実際のスクリプトの単純化されたバージョンです。 (本当に知りたい場合)質問の最後に投稿します。
したがって、問題は、find
複数の検索結果でシェルを実行し、最初の結果が失敗したときに終了する方法です。exec bash -c
そしてまた、後でスクリプトで確認できるゼロ以外の終了コードを返しますか?
*実際のスクリプト*
#!/usr/bin/env bash
find path-a path-b path-c \
-iname build.xml -not -exec bash -c 'echo -n "building {} ..." && ant -f {} build && echo "success" || (echo "failure" && exit 1)' \; -quit
RESULT=$?
echo "result was $RESULT"
ベストアンサー1
これによりトリックが実行されます。
#!/bin/bash
RESULT=0
while IFS= read -r -u3 -d $'\0' file; do
echo -n "building $file ..."
ant -f "$file" build &&
echo "success" ||
{ echo "failure" ; RESULT=1 ; break; }
done 3< <(find path-a path-b path-c -print0)
echo "result was $RESULT"
図のようにループfind
と混在しています。bash
ここ。
$?
変数を直接使用しません$RESULT
。
$RESULT
すべてがうまくいけば0、そうでなければ1です。エラーが発生すると、ループは中断されます。
(使用のため-print0
)悪意のあるファイル名から安全でなければなりません。