bash機能はコマンドラインとは異なる動作をします。

bash機能はコマンドラインとは異なる動作をします。

再帰的にファイルを見つけるためにこのbash関数を作成しました。

ff() {
    find . -type f -name '$1'
}

ただし、結果は返されません。コマンドラインから直接コマンドを実行すると、結果が表示されます。なぜ以下のように異なる動作をするのかよくわかりません。

mattr@kiva-mattr:~/src/protocol$ ff *.so
mattr@kiva-mattr:~/src/protocol$ find . -type f -name '*.so' 
./identity_wallet_service/resources/libindystrgpostgres.so

私の機能が期待どおりに機能しないのはなぜですか?私はMacOSとbashシェルを使っています。

ありがとうマット

ベストアンサー1

問題は、'$1'定義に一重引用符を使用して実際に名前が文字通りのファイルを見つけるためにff実行されていることです。find$1

二重引用符を使用すると、この問題を解決できます。

ff() {
    find . -type f -name "$1"
}

また、現在のディレクトリに指定されたファイルがある場合は、シェルによって拡張された引用符なしでffファイルを渡すため、呼び出しに問題があります。*.so*.so

たとえば、次は失敗します。

mattr@kiva-mattr:~/src/protocol$ touch bogusname.so
mattr@kiva-mattr:~/src/protocol$ ff *.so

検索のみbogusname.soして検索しませんlibindystrgpostgres.so

この問題を解決するには、関数を*.so呼び出すffときに二重引用符または一重引用符を使用する必要があります。

mattr@kiva-mattr:~/src/protocol$ ff '*.so'

または以下も有効です。

mattr@kiva-mattr:~/src/protocol$ ff "*.so"

おすすめ記事