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

  • Как получить символ в заданной позиции строки в сценарии оболочки?
  • Отменить параметр, используемый в команде aliased?
  • Как избежать столкновения / загрязнения пространства имен в сценарии, предназначенном для поиска?
  • Как извлечь URI из файлов
  • Как получить разницу в уровне персонажа с помощью команды «diff» в Linux с помощью сценария оболочки?
  • замените несколько запятых на одну или несколько наборов фигурных скобок и исключение, что в одном или нескольких наборах фигурных скобок
  • Я сделал некоторые поиски и смог заставить его работать с 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.

  • Поиск рекурсивно большого файла
  • Поиск количества времени в определенном номере в файле, где также указан диапазон
  • Что делает $ {3 #?}?
  • сценарии оболочки, которые отвечают на вывод консоли
  • Как запустить сценарий оболочки с двойным щелчком в CentOS 7
  • перечислить файлы и сохранить их в переменных
  • 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 - лучшая ОС в мире.