Încerc să înțeleg următoarea parte despre unset
din https://unix.stackexchange.com/a/381782/674
unset
înbash
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, variabilaunset
nu este doar nesetată, ci și nedeclarată?Dacă
unset
o variabilă care se află în domeniul global de aplicare, variabilaunset
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: