Tratamento correto de cotações em expansões de parâmetros

5

Usando o valor padrão de IFS , considere

unset var
set -- ${var:-"hello"}
echo "$#"

Isso imprime 1 à medida que a expansão do parâmetro é expandida para a única string hello .

unset var
set -- "${var:-"hello"}"
echo "$#"

Isso também gera 1 pelo mesmo motivo.

No entanto, se você usar ksh93 , as seguintes saídas serão 3 , enquanto dash , bash , pdksh e zsh produzirão 1 .

unset var
set -- "${var:-" hello "}"
echo "$#"

No caso ksh93 , obtemos 3 e "$@" duas strings vazias como $1 e $3 , enquanto $2 é a string hello sem espaços de flanqueamento. O comando expandido parece ser set -- "" hello "" in ksh93 e set -- " hello " em outros shells.

Uma questão relacionada (acredito) é

unset var
set -- ${var:-""}
echo "$#"

que gera 1 em todos os shells iguais a sh , exceto em ksh93 , onde gera 0 . Em ksh93 , as aspas parecem ser removidas da string vazia antes da divisão do campo ser executada.

O comportamento ksh93 poderia ser explicado e suportado por como o POSIX diz que as expansões, etc., devem ser executadas?

Para o último dos dois exemplos onde o comportamento entre os shells diferem, eu pessoalmente acho que é um bug (o comando deve expandir de set -- ${var:-""} para set -- "" , não para set -- ), mas para o primeiro exemplo (aquele com set -- "${var:-" hello "}" ) não tenho tanta certeza.

Para testar ksh93 , estou usando a "Versão AJM 93u + 2012-08-01" no OpenBSD 6.4, e também a "Versão A 2017.0.0-devel-2040-g36a76aca", que é a versão atual do desenvolvimento do concha.

    
por Kusalananda 12.11.2018 / 09:36

0 respostas