Yritän ymmärtää seuraavaa osaa aiheesta unset
kohteesta https://unix.stackexchange.com/a/381782/674
unset
sisäänbash
poistaa muuttujan käytöstä vain, jos se on ilmoitettu nykyisessä laajuudessa ( jättää ilmoitetun, paitsi lukuun ottamatta globaalia laajuutta ; se poistaa määritteet ja arvot eikä muuttuja ole enää matriisi tai hash; myös Huomaa, että namerefs, se poistaa viitatun muuttujan). Muuten se vain ponnahtaa yhden muuttujakerroksen edellä mainitusta pinosta.
Bash-käsikirjassa ei mainita mitään liittyvää, tai kaipaan sitä.
Voisitko selittää esimerkeillä
- ”poistaa muuttujan käytöstä vain, jos se on ilmoitettu nykyisessä laajuudessa ”
-
” jätetään ilmoitetuksi, paitsi lukuun ottamatta yleistä laajuutta ”.
Jos
unset
muuttuja, joka on funktion paikallisessa laajuudessa, onkounset
-muuttuja paitsi asetettu myös ilmoittamaton?Jos
unset
muuttuja, joka on globaalissa laajuudessa, onkounset
-muuttuja vain asetettu, mutta silti ilmoitettu?Kuinka voin tarkistaa, onko muuttuja ilmoitettu vai ei?
-
”Muuten se vain ponnahtaa yhden muuttujakerroksen edellä mainitusta pinosta.”
Mitä ”muuten” ja ”yksi muuttujakerros” tarkoittavat?
Kiitos.
Vastaa
Paras esimerkkejä:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
Se, että ”s unset
kutsui samassa laajuudessa ilmoitetun muuttujan. Se on asetettu oikein. Se on edelleen ilmoittanut (vaikka se on menettänyt attribuutit ja arvon), se on silti rajoitettu tähän soveltamisalaan. Huomaa, että vaikka teemme a=2
, se tehdään silti a
-kohdassa f
, ulomman laajuuden omaava ei vaikuta. Se on hyvä ja mitä haluamme.
Sisään:
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
Voit nähdä, että unset a
didn ”t unset a
. Sen sijaan se paljasti sen, joka on alla, ulomman ulottuvuuden. Kun g
palaa, f
”s a
-muuttuja ei ole enää paikallinen.
Bash 5+: ssa se voidaan korjata asettamalla localvar_unset
-vaihtoehto.
Huomaa, että se on vielä huonompi kohdassa mksh
ja yash
missä unset
tekee tämän popping sen sijaan, että poistaisi asetusta jopa muuttujille, jotka on ilmoitettu samassa laajuudessa. Ensimmäinen esimerkki heidän kanssaan antaa:
typeset a=0 2
Lue lisää osoitteesta: