bash函数没有执行,返回"命令未找到"

时间:2017-01-03 20:39:26

标签: bash

在我的.bash_profile中,我有一个函数返回包含传入的参数字符串的所有php文件:

summon() {
 "find . -name '*.php' -exec grep -ril '$1' '{}' \;"
}

当我在命令行(mac)上并且运行summon foo时,我收到错误:

-bash: find . -name '*.php' -exec grep -ril 'foo' '{}' \;: command not found

但是如果我只是将find . -name '*.php' -exec grep -ril 'foo' '{}' \;复制/粘贴到命令行中,那么它可以正常工作,返回包含字符串&f 39的所有php文件。

有没有人知道为什么没有评估这个功能?

3 个答案:

答案 0 :(得分:3)

只需删除召唤函数中的引号即可。引用它,你告诉它寻找一个名为find . -name '*.php' -exec grep -ril '$1' '{}' \;的命令,而不是一个名为find的命令,参数为. -name '*.php' -exec grep -ril '$1' '{}' \;这是有充分理由的。考虑是否有名称包含空格的应用程序(让我们称之为foo bar)。如果没有这个引用语法,那么从bash执行程序将更加困难,因为键入foo bar将尝试使用参数foo运行命令bar,而不是运行{{} 1}}(作为旁注,如果是这种情况,你也可以通过转义空间来运行它:foo bar)。当然,为了增加运行命令的复杂性,将包含空格的可执行文件命名为一种被认为是不好的形式。

您的功能应如下所示:

foo\ bar

另请参阅@gniourf_gniourf对此答案的评论,并提供一些建议,包括在summon() { find . -name '*.php' -exec grep -ril "$1" '{}' \; } 命令上使用-type f将搜索限制为文件并删除不必要的find标志来自grep,因为那里传递的所有文件都是文件。

答案 1 :(得分:3)

松开函数内find周围的双引号。

summon() {
  find . -name '*.php' -exec grep -il "$1" '{}' +
}

在双引号内,shell尝试展开它,以便它可以将其作为表达式进行评估,Shell-Expansion

答案 2 :(得分:0)

单引号内的争论是问题所在。试试如下

summon() {
  find . -name '*.php' -exec grep -ril "$1" {} \;
}
相关问题