我创建了这个 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 shell。
谢谢马特
答案1
问题是您'$1'
在 的定义中使用了单引号ff
,因此您实际上正在运行find
以查找字面名为 的文件$1
。
您可以通过使用双引号来解决这个问题:
ff() {
find . -type f -name "$1"
}
您在调用 时也遇到问题ff
,因为您传递了一个不带引号的文件,如果当前目录中*.so
有一个指定的文件,该文件将由 shell 扩展。*.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"
看:引用