Ce face unset?

Încerc să înțeleg următoarea parte despre unset din https://unix.stackexchange.com/a/381782/674

unset în bash anulează o variabilă numai dacă a fost declarată în domeniul de aplicare curent ( îl lasă declarat deși, cu excepția domeniului global ; elimină atributele și valorile, iar variabila nu mai este matrice sau hash; rețineți că pe namerefs, anulează variabila de referință). În caz contrar, apare doar un strat variabil din stiva menționată mai sus.

Manualul Bash nu menționează nimic legat de asta sau îmi lipsește.

Ați putea explica cu exemple pentru

  • „doar setează o variabilă dacă a fost declarat în domeniul de aplicare curent „
  • „ îl lasă declarat, cu excepția cazului în domeniul de aplicare global ”.

    Dacă unset o variabilă care se află în sfera locală a unei funcții, variabila unset nu este doar nesetată, ci și nedeclarată?

    Dacă unset o variabilă care se află în domeniul global de aplicare, variabila unset este doar nesetată, dar încă declarată?

    Cum pot verifica dacă o variabilă este declarat sau nu?

  • „În caz contrar, apare doar un strat variabil din stiva menționată mai sus.”

    Ce înseamnă „altfel” și „un strat variabil”?

Mulțumesc.

Răspunde

Cel mai bun cu exemple:

$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0 

Că „s unset a apelat la o variabilă declarată în același domeniu. Este corect dezactivată. Este încă declarat (deși a pierdut atribute și valoare), este încă limitat la acest domeniu. Vedeți că, deși facem un a=2, acesta se face totuși pe un a local la f, cel din scopul exterior nu este afectat. Acest lucru este bun și ceea ce vrem.

În:

$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2 

Puteți vedea că unset a nu a fost dezactivat a. În schimb, l-a dezvăluit pe cel de dedesubt, cel din sfera exterioară. Când g revine, variabila f „s a nu va mai fi locală.

În bash 5+, acest lucru poate fi remediat prin setarea opțiunii localvar_unset.

Rețineți că este și mai rău în mksh și yash unde unset face asta popping în loc de dezinset chiar și pentru variabilele care au fost declarate în același domeniu. Primul exemplu cu acestea oferă:

typeset a=0 2 

Lecturi suplimentare la:

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *