Jeg prøver å forstå følgende del om unset
fra https://unix.stackexchange.com/a/381782/674
unset
ibash
deaktiverer bare en variabel hvis den er erklært i gjeldende omfang ( etterlater den erklært, bortsett fra i det globale omfanget ; den fjerner attributter og verdier og variabelen er ikke lenger matrise eller hasj; Vær oppmerksom på at det på navnerfs avbryter den refererte variabelen). Ellers spretter det bare ett variabelt lag fra bunken som er nevnt ovenfor.
Bash-manualen nevner ikke noe relatert, eller jeg savner det.
Kan du forklare med eksempler på
- «bare avbryter en variabel hvis den er erklært i det nåværende omfanget «
-
» etterlater den erklært, bortsett fra i det globale omfanget «.
Hvis
unset
en variabel som er i funksjonens lokale omfang, erunset
variabelen ikke bare usett men også svart?Hvis
unset
en variabel som er i det globale omfanget, erunset
variabelen bare usett men likevel erklært?Hvordan kan jeg sjekke om en variabel er erklært eller ikke?
-
«Ellers spretter det bare ett variabelt lag fra bunken nevnt ovenfor.»
Hva betyr «ellers» og «ett variabelt lag»?
Takk.
Svar
Best 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
kalte på en variabel som er erklært i samme omfang. Den er ikke aktivert. Den er fortsatt erklært (selv om den har mistet attributter og verdi), er den fortsatt begrenset til det omfanget. Du ser at selv om vi gjør en a=2
, er det fortsatt gjort på en a
lokal til f
, påvirkes ikke den fra det ytre omfanget. Det er bra og hva vi vil.
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
la ikke «t av» a
. I stedet avslørte den den under, den fra det ytre omfanget. Når g
returnerer, vil f
«s a
variabel ikke lenger være lokal.
I bash 5+ kan det løses ved å sette alternativet localvar_unset
.
Merk at det er enda verre i mksh
og yash
der unset
gjør det popping i stedet for unsetting selv for variabler som er deklarert i samme omfang. Det første eksemplet med dem gir:
typeset a=0 2
Ytterligere lesing på: