Jeg prøver at forstå følgende del om unset
fra https://unix.stackexchange.com/a/381782/674
unset
ibash
frakobler kun en variabel, hvis den er erklæret i det nuværende omfang ( efterlader det erklæret dog undtagen i det globale omfang ; det fjerner attributter og værdier, og variablen er ikke længere matrix eller hash; også bemærk, at det på namerefs frakobler den refererede variabel). Ellers springer det bare et variabelt lag fra stakken nævnt ovenfor.
Bash-manualen nævner ikke noget relateret, eller jeg savner det.
Kunne du forklare med eksempler til
- “fratager kun en variabel, hvis det er blevet erklæret i det nuværende omfang “
-
” efterlader det erklæret dog undtagen i det globale omfang “.
Hvis
unset
en variabel, der er i funktionens lokale omfang, erunset
variablen ikke bare frakoblet, men også sort?Hvis
unset
en variabel, der er inden for det globale omfang, erunset
variablen bare usat men stadig erklæret?Hvordan kan jeg kontrollere, om en variabel er erklæret eller ej?
-
“Ellers springer det bare et variabelt lag fra stakken nævnt ovenfor.”
Hvad betyder “ellers” og “et variabelt lag”?
Tak.
Svar
Bedst med eksempler:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
At “s unset
kaldte på en variabel, der blev erklæret i samme omfang. Den er korrekt frakoblet. Det er stadig erklæret (selvom det har mistet attributter og værdi), det er stadig begrænset til dette omfang. Du ser, at selvom vi laver en a=2
, gøres det stadig på en a
lokal til f
, påvirkes den fra det ydre omfang ikke. Det er godt, og hvad vi vil have.
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, at unset a
deaktiverede ikke a
. I stedet afslørede den nedenunder, den fra det ydre omfang. Når g
vender tilbage, vil f
“s a
variabel ikke længere være lokal.
I bash 5+ kan det løses ved at indstille indstillingen localvar_unset
.
Bemærk at det er endnu værre i mksh
og yash
hvor unset
gør det popping i stedet for unsetting selv for variabler, der er deklareret i samme omfang. Det første eksempel med dem giver:
typeset a=0 2
Yderligere læsning på: