Bash: `-su: $ *: variável não acoplada` com` set -u`

8

Este é um sistema FreeBSD 7.x executando o GNU bash versão 4.0.

No Bash, a set -uopção pode forçar um shell a imprimir um erro se encontrar uma variável não definida, como esta:

$ set -u
$ echo $THISISUNSET
-su: THISISUNSET: unbound variable
$ echo $?
1

No entanto, também estou encontrando esse mesmo erro por $ *:

$ echo $*
-su: $*: unbound variable
$ echo $?
1
$ echo $@
-su: $@: unbound variable

Manual do Bash 4.3.1 O Set Builtin diz especificamente que set -uignora $ * e $ @:

-u Trate variáveis ​​e parâmetros não configurados que não sejam os parâmetros especiais '@' ou '*' como um erro ao executar a expansão de parâmetros. Uma mensagem de erro será gravada no erro padrão e um shell não interativo será encerrado.

Como posso consertar isso?

Stefan Lasiewski
fonte

Respostas:

11

Este é um erro nas versões mais antigas do bash, especificamente no nível de patch 4.0 β2 d ao 4.0 no nível m patch. Do changelog de 4.0 para 4.1 α:

n. Corrigido o comportamento de set -uestar em conformidade com a interpretação Posix mais recente: toda expansão de uma variável não configurada, exceto $ @ e $ *, fará com que o shell saia.

Esse comportamento foi introduzido no 4.0β2 porque o comportamento anterior (e agora novamente atual) foi considerado um bug:

d. Corrigido um erro que fazia com que expansões de $ @ e $ * não saíssem do shell se a opção -u estivesse ativada e não houvesse parâmetros posicionais.

Gilles 'SO- parar de ser mau'
fonte