Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: fast toothОтветов: 2

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

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

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

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

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

bashquotes

Ответы

Ответ 1 · рейтинг 3 · chepner

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

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

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

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

my_command

Ответ 2 · miken32

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы