Как вы используете переменные со значениями, содержащими пробелы в команде сценария 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.

  • сопоставление файлов с использованием расширения фигурной скобки в zsh
  • Не удалось обновить / обновить пакет Oh-My-Zsh с помощью команды `sudo pacman -S Oh-My-Zsh`
  • Как связать последовательность клавиш с виджетами в режиме vi cmd zsh?
  • Удалить предложение автозавершения zsh
  • Что нужно / не следует входить .zshenv, .zshrc, .zlogin, .zprofile, .zlogout?
  • Могу ли я условно отключить некоторые плагины oh-my-zsh?
  • пользовательский zsh автозаполнение
  • У вас есть backticks (т.е. `cmd`) в * sh оболочках устарели?
  • 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" 
    Linux и Unix - лучшая ОС в мире.