Que fait unset?

Jessaie de comprendre la partie suivante sur unset à partir de https://unix.stackexchange.com/a/381782/674

unset dans bash annule une variable uniquement si elle a été déclarée dans la portée actuelle ( le laisse cependant déclaré sauf dans la portée globale ; il supprime les attributs et les valeurs et la variable nest plus un tableau ou un hachage; aussi notez que sur namerefs, il annule la variable référencée). Sinon, il ne fait apparaître quun calque variable de la pile mentionnée ci-dessus.

Le manuel Bash ne mentionne rien de relatif, ou il me manque.

Pourriez-vous expliquer avec des exemples pour

  • « annule une variable uniquement si il a été déclaré dans la portée actuelle « 
  •  » le laisse cependant déclaré sauf dans la portée globale « .

    Si unset une variable qui est dans la portée locale dune fonction, la variable unset est-elle non seulement non définie mais également non déclarée?

    Si unset une variable qui est dans la portée globale, la variable unset est-elle simplement non définie mais toujours déclarée?

    Comment puis-je vérifier si une variable est déclaré ou pas?

  • « Sinon, il ne fait apparaître quune couche variable de la pile mentionnée ci-dessus. »

    Que signifient «autrement» et «une couche variable»?

Merci.

Réponse

Meilleur avec des exemples:

$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0 

Cela « s unset appelé sur une variable déclarée dans la même portée. Elle est correctement désactivée. Il est toujours déclaré (bien quil ait perdu ses attributs et sa valeur), il est toujours limité à cette portée. Vous voyez que même si nous faisons un a=2, cela se fait toujours sur un a local à f, celui de la portée externe nest pas affecté. Cest bien et ce que nous voulons.

Dans:

$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2 

Vous pouvez voir que unset a na pas été défini a. Au lieu de cela, il a révélé celui en dessous, celui de la lunette extérieure. Lorsque g renvoie, la variable f « s a ne sera plus locale.

Dans bash 5+, cela peut être corrigé en définissant loption localvar_unset.

Notez que cest encore pire dans mksh et yashunset fait cela popping au lieu de désarmer même pour les variables qui ont été déclarées dans la même portée. Le premier exemple avec eux donne:

typeset a=0 2 

Pour en savoir plus:

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *