O que não definido faz?

Estou tentando entender a seguinte parte sobre unset de https://unix.stackexchange.com/a/381782/674

unset em bash 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, a unset 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, a unset 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:

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *