我如何 'exec' 像这样的 bash 命令,其中一个选项是多个单词?

How do I 'exec' a bash command like this where an option is multi-word?

在命令行上,我可以这样 运行 我的二进制文件:

theBinary_exe -q 'more than one word' -f foo -b bar

当我把它放在 bash 脚本和 运行 脚本中时,一切都很好。但是如果我在脚本中这样做:

CMD="theBinary_exe -q 'more than one word' -f foo -b bar"
exec $CMD

'q' 参数仅将第一个单词传递给可执行文件。我也尝试过使用 \" 但没有成功。当我使用 exec 时,是否可以使用包装来防止这种情况?

Do not use a regular parameter.

使用数组:

args=( -q 'more than one word' -f foo -b bar)
theBinary_exe "${args[@]}"

正如评论中所指出的,目前尚不清楚 exec 在这种情况下是否必要。 exec(如果成功)将用 theBinary_exe 替换 bash,调用 bash 消失了...... bash 中 exec 之后的所有内容脚本被忽略,当 theBinary_exe 终止时不再有解释器读取它。

theBinary_exe可以直接调用,bash执行命令时遵循规定的规则:分词,寻找重定向和变量赋值,展开后寻找命令名。

命令名称可以是 theBinary_exe,而不是 exec。如果命令名称与函数名称匹配,则优先,如果函数 'shadows' theBinary_exe 您可以使用 command theBinary_exe 覆盖它并告诉 bash 您的意思是二进制,而不是函数。

如果你知道没有影子函数

theBinary_exe -q 'more than one word' -f foo -b bar

如果存在同名函数,或者您只是想确保没有函数被调用

command theBinary_exe -q 'more than one word' -f foo -b bar

有时您需要有条件地 'build' 参数,在这种情况下,@chepner 使用数组的解决方案是构造参数列表然后在调用时将它们扩展为位置参数的惯用方法。数组得到广泛支持,但不支持 POSIX.

如果考虑到可移植性,请考虑使用函数。函数的一个优点是调用者的位置参数(和特殊的 $#)被保留,参见参考手册中的 Shell-Functions。通过使用中介函数可以解决问题

function run_theBinary_exe {
   set --
   if $condition_1; then
      set -- -q 'more than one word'
   fi
   if $condition_2; then
      set -- "@" -f foo
   fi
   if $condition_3; then
      set -- "@" -b bar
   fi
     
   command theBinary_exe "$@"
}