Как вы используете переменные со значениями, содержащими пробелы в команде сценария Z-shell (zsh)?

У меня есть следующий сценарий Z-оболочки:

compiler=clang++ standard=-std=c++11 warnings="-Wall -Wextra -Wpedantic" ${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp 

Это не работает, поскольку переменная $ {warnings} представляется видимой как «-Wall -Wextra -Wpedantic» – это одно длинное предупреждение с пробелами по сравнению с тремя отдельными предупреждениями.

Я сделал некоторые поиски и смог заставить его работать с eval:

 eval "${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp" 

Однако я смущен, почему это необходимо, а также есть какой-то другой способ исправить эту проблему.

EDIT: В дополнение к этому, как показано в ответе Питера О., я обнаружил, что вы можете сделать:

 setopt shwordsplit 

чтобы заставить Z-оболочку вести себя как другие производные оболочки Бурна. Как говорится в их FAQ :

В большинстве производных Bourne-shell, многословные переменные, такие как

 var="foo bar" 

разделяются на слова, когда они передаются команде или используются в f для цикла $ var. По умолчанию zsh не имеет такого поведения: переменная остается нетронутой. (Это не ошибка! См. Ниже.) Для обеспечения совместимости существует опция SH_WORD_SPLIT.

One Solution collect form web for “Как вы используете переменные со значениями, содержащими пробелы в команде сценария Z-shell (zsh)?”

Задайте параметры предупреждения в виде массива. "${warnings[@]}" генерирует 3 отдельных слова

 warnings=(-Wall -Wextra -Wpedantic) "${compiler}" "${warnings[@]}" "${standard}" -o "${1}" "${1}.cpp" 

Или, если вы найдете его более понятным, вы можете создать массив без -W , а затем добавить -W через то, как вы представляете массив в командной строке.

 warnings=( all extra pedantic ) "${compiler}" "${warnings[@]/#/-W}" "${standard}" -o "${1}" "${1}.cpp" 
  • cd в каталог символически связанного файла
  • POSIX-совместимый / кросс-shell-способ для получения версии запущенной оболочки?
  • zsh и COLUMNS
  • chsh не работает в win10 sub linux
  • Ограничение опции grep --color для интерактивной оболочки
  • Как я могу подавить пространство между сгенерированными аргументами во время расширения фигурной скобки?
  • Запрос Powerline bash не раскрашен в tmux
  • перемещать файлы по шаблону с помощью zsh / zmv
  • Невозможно удалить апострофы из имен файлов в терминале
  • zsh: команда не найдена: {compinstall, compinit, compdef}
  • Доступ к элементу случайного массива в ZSH
  • пользовательский zsh автозаполнение
  • Linux и Unix - лучшая ОС в мире.