bash 使用带有多个参数的 bash -c 时出现引用问题

bash quoting issue when using bash -c with more than one argument

首先我要为糟糕的标题道歉,我的问题可以通过以下示例得到最好的说明:

这个命令工作正常,尽管这样做没有多大意义。

sudo bash -c 'pwd 2>/dev/null'

但是当我把它放在一个变量中,然后做:

COMMAND="sudo bash -c 'pwd 2>/dev/null'"
(set -xv; ${COMMAND})

我收到引用不匹配错误:

+ sudo bash -c ''\''pwd' '2>/dev/null'\'''
2>/dev/null': -c: line 0: unexpected EOF while looking for matching `''
2>/dev/null': -c: line 1: syntax error: unexpected end of file

这里的问题好像是pwd2>/dev/null之间的space,下面的作品:

COMMAND="sudo bash -c 'pwd'"
(set -xv; ${COMMAND})

即使我只是在 pwd

后面放一个拖尾白space 也会出现问题

我在这里做错了什么?我该如何解决?提前致谢。

上面的评论是正确的,您可能会找到更好的方法。但是,唱反调,你试过eval到运行的命令吗?

COMMAND="sudo bash -c 'pwd 2>/dev/null'"
(set -xv; eval $COMMAND)

你至少应该使用一个数组,它作为第二层正确的引用,而不是一个扁平的字符串:

my_command=(sudo bash -c 'pwd 2>/dev/null')
"${my_command[@]}"

但是,您应该重新考虑为什么您认为有必要首先存储这样的命令。一个函数是一个更好的主意:

my_command () {
    sudo bash -c 'pwd 2> /dev/null'
}

my_command