проблема с цитированием bash при использовании bash -c с более чем одним аргументом

сначала я хочу извиниться за плохой заголовок, мою проблему лучше всего иллюстрирует следующий пример:

Эта команда работает нормально, хотя в этом нет особого смысла.

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, работает следующее:

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

Проблема возникает, даже когда я просто ставлю пробел после pwd

Что я здесь делаю неправильно? и как мне это решить? Заранее спасибо.


person fast tooth    schedule 25.09.2015    source источник
comment
Часто задаваемые вопросы по Bash 050   -  person Etan Reisner    schedule 25.09.2015
comment
Рискуя чрезмерного обобщения, никогда нет веской причины встраивать всю команду в одну строку для выполнения. Объясните, почему вы считаете это необходимым; вероятно, есть лучший подход к решению вашей проблемы.   -  person chepner    schedule 25.09.2015


Ответы (2)


Вы должны по крайней мере использовать массив, который действует как второй уровень правильного цитирования, вместо плоской строки:

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

Тем не менее, вы должны переосмыслить, почему вы считаете необходимым хранить такую ​​​​команду в первую очередь. Функция - лучшая идея:

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

my_command
person chepner    schedule 25.09.2015

Комментарий выше правильный, вы, вероятно, можете найти лучший способ сделать это. Но, играя в адвоката дьявола, вы пробовали eval запустить команду?

COMMAND="sudo bash -c 'pwd 2>/dev/null'"
(set -xv; eval $COMMAND)
person miken32    schedule 25.09.2015
comment
Нет! eval не ответ! особенно с расширением переменной без кавычек! - person gniourf_gniourf; 25.09.2015