Estou tentando entender a seguinte parte sobre unset de https://unix.stackexchange.com/a/381782/674
unsetembashapenas 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
unsetuma variável que está no escopo local de uma função, aunsetvariável não apenas não está definida, mas também não está declarada?Se
unsetuma variável que está no escopo global, aunsetvariá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: