Bash shell 脚本函数给出 "find: missing argument to `-exec'" 错误

Bash shell script function gives "find: missing argument to `-exec'" error

我在 Bash shell 脚本中编写了一个函数,用于在 Linux 树中搜索与包含正则表达式的模式匹配的文件名,并使用颜色突出显示:

function ggrep {
 LS_="ls --color {}|sed s~./~~"
 [ -n "" -a "" != "*" ] && NAME_="-iname " || NAME_=
 [ -n "" ] && EXEC_="egrep -q \"\" \"{}\" && $LS_ && egrep -n \"\" --color=always \"{}\"|sed s~^B~\ B~" || EXEC_=$LS_
 FIND_="find . -type f $NAME_ -exec sh -c \"$EXEC_\" \;"
 echo -e \e[7m $FIND_ \e[0m
 $FIND_
}

例如ggrep a*列出当前目录树下所有以a开头的文件,

ggrep a* xa 开头并包含 x

的文件列表

当我 运行 它时,我得到:

find: missing argument to `-exec'

即使我在将 "echo" 输出的行复制并粘贴到终端时得到了正确的输出。谁能告诉我我做错了什么?

其次,如果 ggrep * x 列出所有包含 x 的文件就更好了,但是 * 扩展为文件名列表,我需要使用 \*'*' 代替。有没有解决的办法?谢谢!

\; 而不是 \; 终止 find 命令。

find . -type f $NAME_ -exec sh -c \"$EXEC_\" \;
eval $FIND_

函数体的最后一行对我来说很好。

BASH 中的扩展通常不是递归的,因此如果您从变量加载命令,您应该始终使用 "eval" 强制重新处理扩展变量,因为它是一个新输入。通常引号在已经展开的字符串中处理不当。

关于你的第二个问题,我认为目前还没有令人满意的解决方案。 shell 在将它传递给您控制的任何东西之前总是会展开 *。您可以禁用此扩展,但这是一个全局设置。无论如何,我认为这种扩展实际上可以有利于您的功能。考虑以利用它的方式重写它。 (我没有分析当前版本是否接近那个。)