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
这里的问题好像是pwd
和2>/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
首先我要为糟糕的标题道歉,我的问题可以通过以下示例得到最好的说明:
这个命令工作正常,尽管这样做没有多大意义。
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
这里的问题好像是pwd
和2>/dev/null
之间的space,下面的作品:
COMMAND="sudo bash -c 'pwd'"
(set -xv; ${COMMAND})
即使我只是在 pwd
我在这里做错了什么?我该如何解决?提前致谢。
上面的评论是正确的,您可能会找到更好的方法。但是,唱反调,你试过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