findで関数を呼び出すときの変数範囲

findで関数を呼び出すときの変数範囲

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エクスポートまたは実行する必要はありません。myfunctionbash

GNU、busybox、一部のBSDなどの述語をfindサポートしている場合は、置き換えることができます。-print0find-exec printf '%s\0' {} +-print0

おすすめ記事