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

时间:2015-09-25 17:24:35

标签: bash quotes

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

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

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之间的空格,以下作品:

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

即使我在pwd

之后放了一个拖尾空格,问题也会出现

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

my_command

答案 1 :(得分:0)

上面的评论是正确的,您可以找到更好的方法来做到这一点。但是,扮演魔鬼的拥护者,你试过eval来运行命令吗?

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