Jessaie de comprendre la partie suivante sur unset
à partir de https://unix.stackexchange.com/a/381782/674
unset
dansbash
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 variableunset
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 variableunset
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 yash
où unset
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: