Co dělá unset?

Snažím se porozumět následující části o unset z https://unix.stackexchange.com/a/381782/674

unset v bash 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:

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *