bash函数未执行,返回;“未找到命令”;

bash函数未执行,返回;“未找到命令”;,bash,Bash,在我的.bash_配置文件中,我有一个函数,返回包含传入参数字符串的所有php文件: summon() { "find . -name '*.php' -exec grep -ril '$1' '{}' \;" } 当我在命令行(mac)上运行召唤foo时,我得到错误: -bash: find . -name '*.php' -exec grep -ril 'foo' '{}' \;: command not found 但是如果我只是复制/粘贴find-名称'*.php'-execgre

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

summon() {
 "find . -name '*.php' -exec grep -ril '$1' '{}' \;"
}
当我在命令行(mac)上运行
召唤foo
时,我得到错误:

-bash: find . -name '*.php' -exec grep -ril 'foo' '{}' \;: command not found
但是如果我只是复制/粘贴
find-名称'*.php'-execgrep-ril'foo'{}\编码到命令行中,然后它正常工作,返回所有包含字符串“foo”的php文件


有人知道为什么不计算该函数吗?

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

您的函数应该如下所示:

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

另请参阅@gniourf\u gniourf对这个答案的评论,并提供一些建议,包括在
find
命令中使用
-type f
来限制对文件的搜索,并从grep中删除不必要的
-r
标志,因为所有传递到那里的文件都会有文件。

只需从你的召唤函数中删除引号即可引用它,你告诉它查找一个名为“代码>查找”的命令。-“**.php”-ExcGRP-RIL $ 1“{}”;而不是一个名为“代码>查找< <代码> > <代码> >的参数。-No.*.php’-ExcGRP- RIL $ 1’'{};这是一个很好的理由;考虑是否有一个其名称包含一个空间的应用程序。(我们称之为
foo-bar
)。如果没有这种引用语法,程序将更难从bash执行,因为键入
foo-bar
将尝试使用参数
bar
运行命令
foo
,而不是运行
foo-bar
(作为旁注,如果是这种情况,您也可以通过转义空格来运行它:
foo\bar
)。当然,将包含空格的可执行文件命名为某物会被认为是不好的形式,因为这样会增加运行命令的复杂性

您的函数应该如下所示:

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

另请参阅@gniourf\u gniourf对这个答案的评论,并提供一些建议,包括在
find
命令中使用
-type f
来限制对文件的搜索,并从grep中删除不必要的
-r
标志,因为所有传递到那里的文件都会有文件。

松开
find
周围的双引号在功能范围内

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

在双引号中,shell尝试将其展开,以便将其作为表达式进行计算,

在函数中的
find
周围松开双引号

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

在双引号内,shell尝试将其展开,以便可以将其作为表达式进行计算,

单引号内的参数是问题所在

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

单引号内的参数就是问题所在。请尝试以下方法

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

但是您需要在
$1
周围加上双引号:我有一个函数,它返回包含传递的参数字符串的所有php文件。提示OP使用
-type f
可能很好。(而且
grep
-r
开关可能也没用)。您还可以提供GNU
grep
唯一的答案
:D
。但是您需要在
$1
周围加上双引号:我有一个函数,它返回包含传递的参数字符串的所有php文件。提示OP使用
-type f
可能很好。(而且
grep
-r
开关可能也没用)。您还可以提供GNU
grep
仅回答
:D
。如果我这样做,则不会返回任何文件(即使我知道其中有带有“foo”的文件,因为我在不调用call()的情况下将字符串复制/粘贴到命令行时会返回文件)将$1放在双引号中,而不是单引号中。单引号会导致变量不展开,而是传递文本字符串“$1”,我很乐意!如果这里的答案解决了您的问题,请将其标记为已接受,如果您不介意的话:)是的,我会的,出于某种原因,这会让我再等3分钟。但是你能改变你建议的解决方案,让双引号在1美元左右吗?你可以给OP一些提示:1.使用
-type f
.2.
grep
's
-r
开关没有用。3.使用
-exec grep…{}+
。如果我这样做,那么就不会返回任何文件(即使我知道其中有带有“foo”的文件,因为我在不调用call()的情况下将字符串复制/粘贴到命令行时返回了文件)将$1放在双引号中而不是单引号中。单引号会导致变量不展开,而不是传递文本字符串“$1”我很乐意!如果这里的答案解决了您的问题,如果您不介意,请将其标记为已接受:)是的,我会的,出于某种原因,这会让我再等3分钟。但是你能把你建议的解决方案改成双引号在1美元左右吗?你可以给OP一些提示:1.使用
-type f
.2.
grep
's
-r
开关没有用。3.使用
-exec grep…{}+