Eu estava usando expansão indireta e contando com o resultado sendo uma string nula quando a variável não está definida:
$ $SHELL --version | head -1
GNU bash, version 4.4.23(1)-release (x86_64-unknown-linux-gnu)
$ unset var
$ echo "${!var}"
$
mas em uma nova caixa Linux que falha com invalid indirect expansion
:
$ $SHELL --version | head -1
GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu)
$ unset var
$ echo "${!var}"
-bash: var: invalid indirect expansion
$
Obviamente, posso alterar meu código para funcionar nos dois lugares, mas até agora não consegui descobrir a diferença exata entre os 2 sistemas que está causando a falha em 1, mas não no outro, e quero saber qual é a melhor diferença resolver esse problema e qualquer coisa semelhante que surgir no futuro.
Se for apenas a mudança na versão do bash, não consigo encontrar nenhuma nota de lançamento ou qualquer coisa que indique isso. Se for alguma opção definida em um, também não consigo encontrar (não é, set -u
por exemplo). FWIW aqui está a diferença na shopt
saída entre a máquina que está falhando (segunda coluna) e aquela que não está (terceira coluna):
$ awk 'FNR==1{ARGIND++} {a[$1,ARGIND]=$2; b[$1]} END{for (var in b) if (a[var,1] != a[var,2]) print var, a[var,1], a[var,2]}' bad good | column -t
autocd off
compat32 off
localvar_unset off
lastpipe off
localvar_inherit off
complete_fullquote on
assoc_expand_once off
checkwinsize on off
globasciiranges on
compat40 off
compat41 off
compat42 off
inherit_errexit off
compat43 off
compat44 off
checkjobs off
expand_aliases on off
globstar off
progcomp_alias off
dirspell off
direxpand off
login_shell on off
Alguém sabe exatamente por que vejo a falha em uma caixa Unix, mas não na outra?
Foi alterado para 5.0-alpha, o
CHANGES
arquivo na fonte Bash tem esta entrada:Aqui está um post sobre isso do autor na lista de discussão: https://lists.gnu.org/archive/html/bug-bash/2016-11/msg00165.html
De fato, com o Bash 4.4, o caso com erros de valor vazio: