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

  • Как отредактировать приглашение командной строки для отображения времени?
  • Как передать переменные среды в новый сеанс входа в ssh?
  • Сценарий Shell / Bash: Правильно отказаться от привилегий
  • При применении команд к группам строк из stdin
  • zsh glob pattern для соответствия всем файлам, кроме одного, не работает, несмотря на то, что EXTENDED_GLOB установлен
  • Как я могу достичь root после переключения с bash на zsh?
  • zsh: Завершение табуляции для функции с помощью команд Git
  • Могу ли я ссылаться на команду перед '&&' после '&&'
  • 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 - лучшая ОС в мире.