Hva gjør unset?

Jeg prøver å forstå følgende del om unset fra https://unix.stackexchange.com/a/381782/674

unset i bash 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, er unset variabelen ikke bare usett men også svart?

    Hvis unset en variabel som er i det globale omfanget, er unset 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å:

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *