Jag försöker förstå följande del om unset
från https://unix.stackexchange.com/a/381782/674
unset
ibash
stänger bara av en variabel om den har deklarerats i det aktuella omfånget ( lämnar det deklarerat men utom i det globala omfånget ; det tar bort attribut och värden och variabeln är inte längre array eller hash; också Observera att på namerefs avaktiveras den refererade variabeln). Annars dyker det bara upp ett variabelt lager från stapeln som nämns ovan.
Bash-manualen nämner inte något relaterat, eller jag saknar det.
Kan du förklara med exempel för
- ”stänger bara av en variabel om det har förklarats i det nuvarande omfånget ”
-
” lämnar det deklarerat men utom i det globala omfånget ”.
Om
unset
en variabel som finns i funktionens lokala omfång, ärunset
variabeln inte bara avstängd utan också odeklarerad?Om
unset
en variabel som är i det globala omfånget, ärunset
variabeln bara avstängd men ändå deklarerad?Hur kan jag kontrollera om en variabel är deklareras eller inte?
-
”Annars dyker det bara upp ett variabelt lager från stapeln som nämns ovan.”
Vad betyder ”annars” och ”ett variabelt lager”?
Tack.
Svar
Bäst med exempel:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
Att ”s unset
anropade en variabel som deklareras i samma omfattning. Den är ordentligt avstängd. Det är fortfarande deklarerat (även om det har tappat attribut och värde), är det fortfarande begränsat till det omfattningen. Du ser att även om vi gör en a=2
så görs det fortfarande på en a
lokal till f
påverkas inte den från det yttre omfånget. Det är bra och vad vi vill ha.
I:
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
Du kan se att unset a
avmarkerade inte a
. Istället avslöjade den en under, den från det yttre omfånget. När g
återvänder kommer f
”s a
inte längre att vara lokal.
I bash 5+ kan det åtgärdas genom att ställa in alternativet localvar_unset
.
Observera att det är ännu värre i mksh
och yash
där unset
gör det poppar istället för avstängning även för variabler som har deklarerats i samma omfattning. Det första exemplet med dem ger:
typeset a=0 2
Ytterligare läsning på: