Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash shell脚本函数给出;查找:`-exec';缺少参数&引用;错误_Linux_Bash - Fatal编程技术网

Linux Bash shell脚本函数给出;查找:`-exec';缺少参数&引用;错误

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_

我在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*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个)反斜杠会得到相同的结果(同样的回波输出)。你是在引号内完成的,所以没有必要转义
find-键入f$NAME_u2;exec sh-c\“$exec_2;”{}”?所以…让我们等待@GnubieAs作为一条一般规则,将命令作为字符串放入shell变量中,然后再运行它们将导致大量引用痛苦。我建议你另找一个方法来解决你的问题。如果必须将命令存储在变量中,请使用.Well-done,Tomasz:eval解决了这个问题!也谢谢你解释*扩展。我想我必须使用不同的符号来保存一些输入。。。
eval $FIND_