Tanto quanto eu posso dizer, POSIX deixa $@
em uma atribuição indefinida , então não é realmente um bug, exceto talvez na documentação do Bash. $@
é definido em dois casos:
- When the expansion occurs in a context where field splitting will be performed...
- When the expansion occurs within double-quotes, the behavior is unspecified unless [...] Field splitting would be performed [...] (*)
Mas,
In all other contexts the results of the expansion are unspecified.
A divisão de campo não acontece em uma atribuição e não aconteceria mesmo sem as aspas duplas, o que é indefinido.
Agora, suponho que a="$@"
atue da mesma maneira que a="$*"
, porque expandir para várias palavras não faria sentido algum aqui. Você não pode atribuir várias palavras a uma variável regular como entidades distintas, e atribuir uma, mas usando o resto como argumentos de comando, seria confuso e propenso a erros.
Como essa página de verificação de shell diz, o comportamento de "$@"
em uma atribuição é diferente entre os shells. Bash e ksh unem os parâmetros posicionais com espaços, zsh e traço com a primeira letra de IFS
(exatamente como "$*"
faria).
$ bash -c 'set -- x y z; IFS=.; a="$@"; printf "<%s>\n" "$a"'
<x y z>
$ ksh93 -c 'set -- x y z; IFS=.; a="$@"; printf "<%s>\n" "$a"'
<x y z>
$ zsh -c 'set -- x y z; IFS=.; a="$@"; printf "<%s>\n" "$a"'
<x.y.z>
$ dash -c 'set -- x y z; IFS=.; a="$@"; printf "<%s>\n" "$a"'
<x.y.z>
Provavelmente, é melhor usar a="$*"
se você quiser unir-se a uma única string ou escrever explicitamente o que quiser.
(* ou outro caso envolvendo ${parameter:-word}
de expansões)