Estou aprendendo a usar com eficiência diferentes set
opções no meu script e deparei-me set -u
que parece ser perfeito para sair do meu script se uma variável não for definida corretamente (por exemplo, excluindo usuários). De acordo com a página do manual , set -u
e set -e
faz o seguinte ...
-e Exit immediately if a command exits with a non-zero status.
-u Treat unset variables as an error when substituting.
Criei um script de teste para testar essa funcionalidade, mas ela não parece estar funcionando conforme o esperado. Talvez alguém possa me explicar melhor o meu problema e onde estou interpretando mal? O script de teste está abaixo. Obrigado.
set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}
Espero que o script exiba 0 e "Isso funcione" e falhe, pois ${testing2}
não está definido.
Em vez disso, são exibidos 0 e "Isso funciona" , seguido por 0 e, em seguida, 0 Isso não deve aparecer
Alguém pode fornecer algum conhecimento? Obrigado.
fonte
Respostas:
De "homem Bash":
Quando você
testing2=
define a variável como uma seqüência nula.Mude isso para
unset testing2
e tente novamente.A
set -e
não ajuda neste caso como uma atribuição não tem um código de saída 1. Tente isto para ver que o último comando executado (a atribuição) tem um código de saída de 0, ou ler esta pergunta :E também acredito que o uso de set -e é mais um problema do que uma solução.
O que pode receber um erro com o uso de variáveis não definidas é
set -u
:Saída:
fonte
testing2=
define atesting2
variável como uma sequência vazia; a variável realmente está definida .No entanto, se você executasse
echo $testing99
um shell Bash interativo (sem configuraçãoerrexit
, por exemplo,set -e
), você receberia um erro:a parte, de lado
Ao testar scripts agora, descobri que um shell interativo nem sempre sai ao tentar expandir uma variável que não foi definida enquanto um shell não interativo (executando um script de shell) sempre sai . De acordo com a página do manual POSIX para
set
:Um shell Bash interativo não será fechado, a menos
errexit
que também tenha sido definido. Por outro lado, um shell de traço interativo não sai - mesmo seset -e
já tiver sido executado anteriormente.fonte