Bashスクリプトには、渡された引数に対していくつかの処理を実行する関数があります。処理がどのように進行したかに応じて戻り値を設定したいと思います。問題は関数がから呼び出されるため、find ... -exec bash -c func
この方法でグローバル変数を更新する機会が失われることerror_code
です。
#!/bin/bash
check_file() {
filename=$1
echo -n "$filename ... "
if [ ... ]; then
echo "NOK"
# return/update error_code?
else
echo "OK"
fi
}
export -f check_file
# look for exec binary only
find . -type f -executable -exec bash -c "file -i {} | grep -q 'application/x-executable; charset=binary'" \; -exec bash -c 'check_file "$0"' {} \;
# exit $error_code??
関数がグローバル変数を更新できる場合、関数は複数回呼び出されるため、error_code
ハンドルが「NOK」の場合にのみ更新されます。find
check_file
既存のスクリプトを使用してこれを行うにはどうすればよいですか?それとも別のアプローチが必要なのでしょうか?
答え1
私は好きなようにスクリプトを実行させました。最もエレガントな解決策ではありませんが、作業は完了しました。
メインシェルは一時ファイルを生成し、その名前を書き込むことができる後続のサブシェルにエクスポートします。メインシェルは最終的に戻りコードを読み取り、一時ファイルを削除してからエラーコード値を返します。
#!/bin/bash
export tmpf=`mktemp`
rcode=0
echo $rcode > $tmpf
...
check_file() {
...
echo 1 > $tmpf
...
}
...
rcode=`cat $tmpf`
rm -f $tmpf
echo "done."
exit $rcode