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 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"

看:引用

相关内容