在-exec arg上找到命令fusses

时间:2014-09-11 01:53:28

标签: bash find

我正在尝试从脚本构建并运行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来说明。

由于 迪内希

1 个答案:

答案 0 :(得分:5)

尝试在bash变量中存储复杂的命令,然后很好地评估变量。

如果需要分段构建命令,请使用数组。请参阅此有用的Bash常见问题解答:I'm trying to put a command in a variable, but the complex cases always fail!

这是基本策略:

# 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执行模型的程序员来说似乎很困惑。