O seguinte script bash:
#!/bin/bash
TEST_VAR=""
if [[ -z $TEST_VAR ]] then
echo "empty"
else
echo "$TEST_VAR"
fi
apesar de faltar um ponto e vírgula antes de "then", não gera erro no bash 5.2 e é concluído com sucesso, retornando até 0
.
Executar o script acima em um sistema executando o bash 5.1 ou 5.0 falha como esperado.
Por que isso? O bash mudou seu parser na versão 5.2? Depois de pesquisar, não consegui encontrar nenhuma referência a essa mudança. O bash mudou o comportamento aqui intencionalmente ou isso é um bug?
Obrigado a oguz ismail, que forneceu provas para apoiar minha intuição que não consegui encontrar - tanto a discussão relevante na lista de discussão quanto o commit do git que implementou isso.
Em poucas palavras, após uma discussão na lista de discussão ocorrida antes do lançamento da versão 5.2, foi descoberto que o comportamento de
[[]]
exigir um ponto e vírgula no final era inconsistente com o de outros comandos compostos , que não exigiam um ponto e vírgula no final, e[[]]
o comportamento de foi alterado para se adequar àqueles anteriores ao lançamento da versão 5.2 .]]
é uma palavra reservada:De Palavras Reservadas (Manual de Referência Bash) - ênfase minha:
E
[[ expression ]]
é, de fato, um comando composto .Historicamente, outros comandos compostos, como
{}
ou()
nunca, exigiam um ponto e vírgula depois deles:Então
[[]]
o comportamento do foi alterado para se adequar ao anterior ao lançamento da versão 5.2.