Estou tentando entender a seguinte parte sobre unset
de https://unix.stackexchange.com/a/381782/674
unset
embash
apenas cancela a definição de uma variável se ela foi declarada no escopo atual ( deixa-o declarado, exceto no escopo global ; remove atributos e valores e a variável não é mais array ou hash; também observe que em namerefs, ele remove a configuração da variável referenciada). Caso contrário, ele apenas remove uma camada variável da pilha mencionada acima.
O manual do Bash não menciona nada relacionado, ou sinto falta disso.
Você poderia explicar com exemplos para
- “apenas cancelar a definição de uma variável se foi declarado no escopo atual “
-
” deixa-o declarado, exceto no escopo global “.
Se
unset
uma variável que está no escopo local de uma função, aunset
variável não apenas não está definida, mas também não está declarada?Se
unset
uma variável que está no escopo global, aunset
variável apenas não definida, mas ainda declarada?Como posso verificar se uma variável é declarado ou não?
-
“Caso contrário, ele apenas retira uma camada variável da pilha mencionada acima.”
O que significam “caso contrário” e “uma camada variável”?
Obrigado.
Resposta
Melhor com exemplos:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
Isso “s unset
chamado em uma variável declarada no mesmo escopo. Está apropriadamente não configurada. Ainda é declarado (embora tenha perdido atributos e valor), ainda está limitado a esse escopo. Você vê que, embora façamos um a=2
, isso ainda é feito em um a
local para f
, aquele do escopo externo não é afetado. Isso é bom e o que queremos.
Em:
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
Você pode ver que unset a
não cancelou a
. Em vez disso, revelou o que estava embaixo, o do escopo externo. Quando g
retorna, a variável f
“s a
não será mais local.
No bash 5+, isso pode ser corrigido definindo a opção localvar_unset
.
Observe que é ainda pior em mksh
e yash
onde unset
faz isso popping em vez de desarmar mesmo para variáveis que foram declaradas no mesmo escopo. O primeiro exemplo com eles fornece:
typeset a=0 2
Leitura adicional em: