関数、コマンド、および組み込み機能の検索

関数、コマンド、および組み込み機能の検索

重複の可能性:
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あなたの関数は、その述語が文字通り-execCライブラリ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

関連情報