Não entendo por que a expressão de matriz está correta.
$ set -eu
$ echo "${envs[*]}"
$ echo "${envs}"
bash: envs: unbound variable
Como posso fazer o bash falhar também nessa expansão de array?
Não entendo por que a expressão de matriz está correta.
$ set -eu
$ echo "${envs[*]}"
$ echo "${envs}"
bash: envs: unbound variable
Como posso fazer o bash falhar também nessa expansão de array?
O manual afirma (ênfase minha):
Então você não pode.
Na verdade, o comportamento mudou nesse sentido na versão 4.4, mas definir
BASH_COMPAT=4.3
ou habilitar acompat43
opção não restaura o comportamento antigo.Onde o comportamento do bash-4.3 pode ser considerado problemático é que
"${array[@]}"
withnounset
on também sai quando o array é definido como uma lista vazia:Aqui, você pode alternar para um dos outros shells com suporte a array que se comportam de forma diferente nesta instância:
Cuidado com:
Que se comporta como o bash-4.3 e anteriores, exceto que em
mksh
, a variável é verdadeiraunset
quando é atribuída uma lista vazia ou quando uma variável de matriz teve o último de seus elementos não definido.Note que POSIX requer
"$@"
e"$*"
expansões para não sair quando"$#"
for 0 (lista vazia de parâmetros posicionais) que esses shells honram¹. Isso não é estritamente falando uma variável (emborazsh
mapeie a lista de parâmetros posicionais para a$argv
variável), mas esses shells consideram que isso seja definido mesmo quando for para uma lista vazia. Com zsh:¹ mas o bash era um dos shells que não costumava fazer isso , uma das razões pelas quais coisas como
${1+"$@"}
eram usadas para contornar esse problema (e outros em outros shells antigos)