デフォルトでは、パイプラインの終了ステータスは、パイプラインの最後のコマンドのステータスです。したがって、perl
プロセスが何かを出力する場合は1で終了し、出力しない場合は0で終了する必要があります。
perl -p -e "\$match = 1 if s/($TAGS)/ error: \$1/; END { exit \$match; }"
注意:前にスペースが追加されましたerror
。
テスト:
$ cat so15307298.sh
TAGS="TODO:|FIXME:"
SRCROOT=.
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" \) -print0 |
xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" |
perl -p -e "\$match = 1 if s/($TAGS)/ error: \$1/; END { exit \$match; }"
$ echo "TODO: this is a problem" > x1.h
$ echo "FIXME: this is a problem too" > x2.h
$ echo "Allez oop" > x3.h
$ sh -x so15307298.sh
+ TAGS='TODO:|FIXME:'
+ SRCROOT=.
+ find . '(' -name '*.h' -or -name '*.m' ')' -print0
+ xargs -0 egrep --with-filename --line-number --only-matching '(TODO:|FIXME:).*$'
+ perl -p -e '$match = 1 if s/(TODO:|FIXME:)/error: $1/; END { exit $match; }'
./x1.h:1: error: TODO: this is a problem
./x2.h:1: error: FIXME: this is a problem too
$