BashスクリプトでFromを定義します。find
問題は、変数の範囲が関数に拡張されないことです。関数内の変数にどのようにアクセスしますか?例は次のとおりです。
variable="Filename:"
myfunction() {
echo $variable $1
}
export -f myfunction
find . -type f -exec bash -c 'myfunction "{}"' \;
これにより、「Filename:」文字列なしでファイル名が出力されます。
find
見つかったすべてのファイルに対して呼び出され、find
まだ変数を定義するために関数を呼び出すより良い方法はありますか?
ベストアンサー1
あなたの質問に対する答えではありませんが、大丈夫です。いいえする:
find . -type f -exec bash -c 'myfunction "{}"' \;
移植性がないという事実に加えて、ファイル名がbash
シェルコードとして解釈されるため、非常に危険です。たとえば、というファイルがある場合はどうなるか考えてみましょう$(rm -rf ~)
。書き下ろす:
find . -type f -exec bash -c 'myfunction "$1"' find+bash {} \;
bash
または、より良い方法は次のとおりです(ファイルごとに1つずつ実行したくない場合)。
find . -type f -exec bash -c 'for file do
myfunction "$file"; done' find+bash {} +
それでは、トピックの質問に答えてみましょう。
次のことができます。
{ find . -type f -exec printf '%s\0' {} + | while IFS= read -ru3 -d '' file; do
myfunction "$file"; done 3<&0 <&4 4<&-; } 4<&0
これにより、myfunction
現在のシェル内で呼び出すことができるため、他のシェルをbash
エクスポートまたは実行する必要はありません。myfunction
bash
GNU、busybox、一部のBSDなどの述語をfind
サポートしている場合は、置き換えることができます。-print0
find
-exec printf '%s\0' {} +
-print0