Linux Bash shell脚本函数给出;查找:`-exec';缺少参数&引用;错误
我在Bash shell脚本中编写了一个函数,用于在Linux树中搜索与包含正则表达式的模式匹配的文件名,并使用颜色高亮显示:Linux Bash shell脚本函数给出;查找:`-exec';缺少参数&引用;错误,linux,bash,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_
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*x
以a
开头并包含x
当我运行它时,我得到:
find: missing argument to `-exec'
即使在复制并将“echo”输出的行粘贴到终端时得到正确的输出。谁能告诉我我做错了什么
其次,如果
ggrep*x
列出了包含x
的所有文件,但*
扩展到一个文件名列表,我需要使用\*
或'*'
。有办法解决这个问题吗?谢谢 用\”终止find
命令代码>而不是\\代码>
find . -type f $NAME_ -exec sh -c \"$EXEC_\" \;
在函数的最后一行,body对我来说很好
BASH中的扩展通常不是递归的,因此如果从变量加载命令,则应始终使用“eval”强制重新处理扩展的变量,因为它是新的输入。通常情况下,引号在已展开的字符串中无法正确处理
关于你的第二个问题,我认为没有令人满意的解决办法。在将外壳传递给您控制的任何对象之前,外壳始终会展开*。您可以禁用此扩展,但这是一个全局设置。不管怎样,我认为这个扩展实际上有利于你的功能。考虑以一种利用它的方式重写它。(我没有分析当前版本是否接近该值。)谢谢,阿维纳什,但我得到了相同的错误。事实上,使用1到4个(包括1到4个)反斜杠会得到相同的结果(同样的回波输出)。你是在引号内完成的,所以没有必要转义不用客气。我也谢谢你,卡洛里。没有反斜杠会为树中的每个文件提供“-color:1:--color:Syntax error:Unterminated quoted string”。是否尝试过find-键入f$NAME_u2;exec sh-c\“$exec_2;”{}”代码>?所以…让我们等待@GnubieAs作为一条一般规则,将命令作为字符串放入shell变量中,然后再运行它们将导致大量引用痛苦。我建议你另找一个方法来解决你的问题。如果必须将命令存储在变量中,请使用.Well-done,Tomasz:eval解决了这个问题!也谢谢你解释*扩展。我想我必须使用不同的符号来保存一些输入。。。
eval $FIND_