Snažím se porozumět následující části o unset
z https://unix.stackexchange.com/a/381782/674
unset
vbash
zruší nastavení proměnné, pouze pokud byla deklarována v aktuálním rozsahu ( ponechává deklarované, s výjimkou globálního rozsahu ; odstraňuje atributy a hodnoty a proměnná již není maticí ani hashem; také Všimněte si, že na namerefs zruší nastavenou proměnnou). Jinak pouze zobrazí jednu proměnnou vrstvu ze zásobníku uvedeného výše.
Manuál Bash nezmiňuje nic souvisejícího, nebo mi to chybí.
Mohl byste vysvětlit příklady pro
- „pouze zruší nastavení proměnné, pokud byl deklarován v aktuálním rozsahu „
-
“ ponechává deklarovaný, s výjimkou globálního rozsahu „.
Pokud
unset
proměnná, která je v místním rozsahu funkce, je proměnnáunset
nejen deaktivovaná, ale také nedeklarovaná?Pokud
unset
proměnná, která je v globálním rozsahu, je proměnnáunset
právě deaktivovaná, ale přesto deklarovaná?Jak mohu zkontrolovat, zda je proměnná deklarováno nebo ne?
-
„Jinak pouze zobrazí jednu proměnnou vrstvu ze zásobníku uvedeného výše.“
Co znamená „jinak“ a „jedna proměnná vrstva“?
Díky.
Odpověď
Nejlepší s příklady:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
To volá unset
proměnnou deklarovanou ve stejném rozsahu. Je správně zrušeno. Je stále deklarován (i když ztratil atributy a hodnotu), je stále omezen na tento rozsah. Vidíte, že i když děláme a=2
, stále se to děje v a
místním f
není ovlivněn ten z vnějšího oboru. To je dobré a to, co chceme.
V:
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
Můžete vidět, že unset a
nezrušil a
. Místo toho odhalil ten pod ním, ten z vnějšího rozsahu. Když se g
vrátí, f
„s a
proměnná již nebude lokální.
V bash 5+ to lze opravit nastavením možnosti localvar_unset
.
Všimněte si, že v mksh
a yash
kde unset
provádí vyskakování místo deaktivace i pro proměnné, které byly deklarovány ve stejném rozsahu. První příklad s nimi dává:
typeset a=0 2
Další čtení na: