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.