Megpróbálom megérteni a következő részt a unset
-ről a https://unix.stackexchange.com/a/381782/674
unset
ittbash
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ó, azunset
változó nem csak nincs beállítva, hanem nem is deklarálva?Ha
unset
egy globális hatókörű változó, azunset
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: