在我的.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文件。
有没有人知道为什么没有评估这个功能?
答案 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" {} \;
}