Mit csinál az unset?

Megpróbálom megérteni a következő részt a unset -ről a https://unix.stackexchange.com/a/381782/674

unset itt bash csak akkor állítja be a változót, ha azt az aktuális hatókörben deklarálták ( deklaráltan hagyja, bár a globális hatókörön kívül ; eltávolítja az attribútumokat és értékeket, és a változó már nem tömb vagy hash; vegye figyelembe, hogy a namerefs-en letiltja a hivatkozott változót). Egyébként csak egy változó réteget jelenít meg a fent említett veremből.

A Bash kézikönyv nem említ semmilyen kapcsolódó dolgot, vagy hiányzik.

Meg tudná magyarázni a

  • “példákkal csak akkor állítja be a változót a jelenlegi hatókörben deklarálva van “
  • ” deklaráltan hagyja, kivéve a globális hatókört “.

    Ha unset a függvény helyi hatókörébe tartozó változó, az unset változó nem csak nincs beállítva, hanem nem is deklarálva?

    Ha unset egy globális hatókörű változó, az unset változó csak nincs beállítva, de még mindig deklarálva van?

    Hogyan ellenőrizhetem, hogy egy változó deklarált vagy sem?

  • “Ellenkező esetben csak egy változó réteget dob ki a fent említett veremből.”

    Mit jelent az “egyébként” és az “egy változó réteg”?

Köszönöm.

Válasz

Legjobb példákkal:

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

Ez a “s unset ugyanazon hatókörben deklarált változót hívta meg. Megfelelően nincs beállítva. Még mindig deklarált (bár elveszítette attribútumait és értékét), még mindig csak erre a körre korlátozódik. Látja, hogy annak ellenére, hogy csinálunk egy a=2 fájlt, ez mégis megtörténik egy a helyi f, a külső körbe tartozó nem érintett. Ez jó és amit akarunk.

In:

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

Láthatja, hogy unset a didn “t unset a. Ehelyett feltárta az alatta levőt, a külső körbe tartozót. Amikor a g visszatér, f “s a változó már nem lesz lokális.

A bash 5+ verzióban ez a localvar_unset opció beállításával javítható.

Vegye figyelembe, hogy még rosszabb a mksh és yash ahol unset ezt felbukkanás helyett letiltás teszi még az azonos hatókörben deklarált változók esetében is. Az első példa a következőket adja:

typeset a=0 2 

További olvasmány:

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük