重複の可能性:
find -exec呼び出しでカスタム関数を実行する
次のようなbashコードがあるとしましょう。
!#/bin/bash
function print_echo (){
echo "This is print_echo Function" $1;
}
find ./ -iname "*" -exec print_echo {} \;
すべての-exec
コマンドに対して次のエラーが発生します。
find: `print_echo': No such file or directory
注:この前にメインプログラムをテストし、別のアルゴリズムでプログラムを解決しましたが、ここに問題があります。findコマンドが組み込みのbashコマンドと関数名を引数として受け入れないのはなぜですか-exec
?
答え1
find
なぜ機能が気に入らないのかわかりません。解決策は次のとおりです。
#!/bin/bash
function print_echo (){
echo "This is print_echo Function" $1;
}
for f in $(find . -iname "*")
do
print_echo $f
done
修正する
上記のスクリプトは、スペースを含むファイルでは機能しません。次のアップデートの機能は次のとおりです。
#!/bin/bash
function print_echo (){
echo "This is print_echo Function" $1;
}
find . -iname "*.sh" | \
while read f
do
print_echo "$f"
done
答え2
find
あなたの関数は、その述語が文字通り-exec
Cライブラリexec
関数を呼び出すことによってプログラムを起動するので、コマンドとして受け入れられません。あなたの機能はbashインタプリタ自体内でのみ機能します。.bashrc
ファイルに関数を定義してもbash
。
したがって、findを2回実行する-exec
カスタムコマンドシーケンスが本当に必要な場合は、それを別のスクリプトファイルに入れるか、別の回避策を使用してください。
答え3
-exec
検索引数でbashソルバーを起動できます。関数が一度に1つのファイル名しか許可されていない場合は、関数を毎回再宣言する必要があるため、このアプローチは効率的ではありません。ファイルのリストを許可し、ルックアップ+
にターミネータを使用して、シェルが一度だけ作成されるように設計できます。ここに例があります。
find -exec bash -c '
print_echo() {
printf "This is print_echo Function: %s\n" "$@"
}
print_echo "$@"
' find-bash {} +
この時点で関数を宣言する理由はありません。で関数を実行するだけですbash -c
。