エラーが発生すると、 'find'はゼロ以外の終了コードを返します。

エラーが発生すると、 'find'はゼロ以外の終了コードを返します。

なぜ以下が表示されますか?

$ 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)悪意のあるファイル名から安全でなければなりません。

おすすめ記事