Как вы используете переменные со значениями, содержащими пробелы в команде сценария 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`?
  • В чем ключевое различие между конфигурацией grml zsh и конфигурацией oh-my-zsh
  • Есть ли хороший способ установить локальные переменные среды каталога / проекта?
  • Сделайте «.» И «источник» по умолчанию равным ~ / .zshrc
  • Как работает вилочная бомба?
  • zsh expand-or-complete для всех файлов независимо от команды / контекста
  • Совместимость скриптов: Сохранить $? для использования позже
  • удаление странных символов из приглашения zsh
  • 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" 
    Interesting Posts

    Более эффективная X-пересылка?

    как удалить функции, отображаемые командой set?

    grep для отображения всех строк, которые начинаются и заканчиваются одним и тем же символом

    Chroot debian сжимает доступ к оболочке

    Почему «ls -all» показывает время для некоторых файлов, но только год для других?

    Могу ли я использовать два набора устройств ввода / вывода для двух пользовательских сеансов на одном компьютере?

    openSuse, новый пользователь не может войти

    Найти последнее появление строки в заданном типе файла во всех подкаталогах

    Разница в производительности между аргументом stdin и командной строки

    Не удалось запустить Gnome после отказа от файла-rc

    Как использовать pacman на контурном изображении Arch для другой архитектуры?

    Может ли bluez запускать крючки при подключении / отключении

    Почему «-» был выбран в качестве суффикса файла резервной копии для некоторых системных файлов Unix?

    Logrotate не запускает proftpd triggerd cronjob

    Получить пароль для входа в opensuse 13.2?

    Linux и Unix - лучшая ОС в мире.