Como você usa variáveis com valores contendo espaços em um comando de script Z-shell (zsh)?

3

Eu tenho o seguinte script Z-shell:

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

Isso não funciona porque a variável $ {warnings} parece ser vista como "-Wall -Wextra -Wpedantic" - este é um longo aviso com espaços, contra três advertências separadas.

Eu fiz algumas pesquisas e consegui fazer com que funcionasse com eval:

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

No entanto, estou confuso sobre por que é necessário, e também há outra maneira de corrigir esse problema.

EDIT: Além de fazer isso como mostrado na resposta de Peter O., descobri que você pode fazer:

setopt shwordsplit

para fazer com que o Z-shell se comporte como outros derivados do shell Bourne. Como eles dizem no seu FAQ :

In most Bourne-shell derivatives, multiple-word variables such as

var="foo bar"

are split into words when passed to a command or used in a for foo in $var loop. By default, zsh does not have that behaviour: the variable remains intact. (This is not a bug! See below.) The option SH_WORD_SPLIT exists to provide compatibility.

    
por Scooter 27.07.2015 / 00:50

2 respostas

5

Defina suas opções de aviso como uma matriz. "${warnings[@]}" gera 3 palavras

individuais
warnings=(-Wall -Wextra -Wpedantic)

"${compiler}" "${warnings[@]}" "${standard}" -o "${1}" "${1}.cpp"

Ou, se você achar mais legível, poderá criar a matriz sem -W e, em seguida, adicionar -W através de como você apresenta a matriz na linha de comando.

warnings=( all extra pedantic )

"${compiler}" "${warnings[@]/#/-W}" "${standard}" -o "${1}" "${1}.cpp"
    
por 27.07.2015 / 02:58
0

Você também pode usar $= para dividir uma variável por $IFS :

${compiler} ${=warnings} ${standard} -o ${1} ${1}.cpp
    
por 24.01.2018 / 18:05