Не используйте переменную для хранения сложных команд, включающих вложенные кавычки. Проблема в том, что когда вы вызываете переменную только с $cmd
, кавычки удаляются неправильно. Поместить команды (или части команд) в переменные, а затем вернуть их нетронутыми, сложно.
Удаление кавычек является частью одного из расширений слов, выполняемых оболочкой. Из выдержки видно из POSIX спецификации оболочки
2.6.7 Удаление цитаты
Символы кавычек (обратная косая черта, одинарные кавычки и двойные кавычки), которые присутствовали в исходном слове, удаляются, если они сами не были заключены в кавычки.
Ваш пример может быть просто воспроизведен простым примером. Предполагая, что у вас есть несколько командных флагов (не фактических)
cmdFlags='--archive --exclude="foo bar.txt"'
Если вы внимательно посмотрите выше, он содержит 2 аргумента, один --archive
и другой для --exclude="foo bar.txt"
, обратите внимание на двойные кавычки, которые необходимо сохранить при прохождении.
Обратите внимание, как кавычки неправильно разделяются, когда я не цитирую cmdFlags
, в printf()
вызове ниже
printf "'%s' " $cmdFlags; printf '\n'
'--archive' '--exclude="foo' 'bar.txt"'
и сравните результат с результатами, приведенными ниже.
printf "'%s' " "$cmdFlags"; printf '\n'
'--archive --exclude="foo bar.txt"'
Таким образом, наряду с предложением правильно заключить в кавычки переменную, общим предложением было бы использовать массив для хранения флагов и передать расширение массива в кавычках
cmdArray=()
cmdArray=(./b2 --reconfigure ${PARALLEL} link=static cxxflags=-fPIC install boost.locale.iconv=off boost.locale.posix=off -sICU_PATH="${ICU_PREFIX}" -sICU_LINK="${BOOST_ICU_LIBS}")
и передать массив как
"${cmdArrray[@]}" >> "${BOOST_LOG}" 2>&1