再帰的にファイルを見つけるためにこの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"
答え2
変数は一重引用符内では拡張されません。二重引用符で囲む必要があります。
ff() {
find . -type f -name "$1"
}
テキスト文字列を検索しています。$1
*
注:また、拡張しないようにコマンドライン引数を引用する必要がありますpwd
。
ff "*.so"
望むより:引用する