Bash shell脚本函数给出“查找:缺少'-exec'参数”错误

时间:2015-01-13 12:56:20

标签: linux bash

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

function ggrep {
 LS_="ls --color {}|sed s~./~~"
 [ -n "$1" -a "$1" != "*" ] && NAME_="-iname $1" || NAME_=
 [ -n "$2" ] && EXEC_="egrep -q \"$2\" \"{}\" && $LS_ && egrep -n \"$2\" --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_
}

e.g。 ggrep a*列出当前目录树下以a开头的所有文件

ggrep a* xa开头且包含x的文件列表

当我运行它时,我得到:

find: missing argument to `-exec'

即使我通过" echo"复制并粘贴线路输出时得到了正确的输出。进入终端。谁能告诉我我做错了什么?

其次,如果ggrep * x列出包含x的所有文件,但*扩展为文件名列表,我需要使用\*或{{ 1}}而不是。有没有解决的办法?谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

eval $FIND_
函数体的最后一行中的

对我来说很好。

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

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