Hvad gør unset?

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

unset i bash 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, er unset variablen ikke bare frakoblet, men også sort?

    Hvis unset en variabel, der er inden for det globale omfang, er unset 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å:

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *