bash函数未执行,返回;“未找到命令”;
在我的.bash_配置文件中,我有一个函数,返回包含传入参数字符串的所有php文件: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
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
开关可能也没用)。您还可以提供GNUgrep
唯一的答案:D
。但是您需要在$1
周围加上双引号:我有一个函数,它返回包含传递的参数字符串的所有php文件。提示OP使用-type f
可能很好。(而且grep
的-r
开关可能也没用)。您还可以提供GNUgrep
仅回答: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…{}+
。