find命令对-exec参数进行了处理



我正在尝试从脚本中构建并运行find命令。但我从find收到了一条非常神秘的错误消息。下面基本上总结了我如何构建命令行并运行它

$ xx="find . -name 'p*' -mmin +10 -exec echo {} \;"
$ echo "$xx" #.....and I get the same print from echo $xx
find . -name 'p*' -mmin +10 -exec echo {} ;
$ $xx
find: missing argument to `-exec'
$ find . -name 'p*' -mmin +10 -exec echo {} ;
./p2.sh
./p1.sh
$ read xx
find . -name 'p*' -mmin +2 -exec echo {} \;
$ $xx
find: missing argument to `-exec'

我陷入困境,将感谢你的帮助。我还想知道是什么导致了这种情况。我在SLES上使用bash 3.2.51。

我想要执行的实际命令稍微长一点,但我在这里使用echo只是为了说明。

谢谢Dinesh

试图将复杂的命令存储在bash变量中,然后很好地评估变量是行不通的。

如果需要分段构建命令,请使用数组。请参阅这个有用的Bash常见问题解答:我试图将命令放入变量中,但复杂的情况总是失败!。

以下是基本策略:

# Make an array
declare -a findcmd=(find .)
# Add some arguments
findcmd+=(-name 'p*')
findcmd+=(-mmin +10)
findcmd+=(-exec echo {} ;)
# Run the command
"${findcmd[@]}"

您需要了解bash引用是如何工作的。请记住,当您键入命令时(或bash从脚本文件中读取命令时),引用(和取消引用)只发生一次。进入变量值的引号只是普通字符。

如果您正在试用set -x,还请记住set -x插入引号以消除歧义。这些引号不是变量的一部分。虽然这显然是必不可少的,但对于不熟悉bash执行模型的程序员来说,这似乎让他们感到困惑。

最新更新