Mitä unset tekee?

Yritän ymmärtää seuraavaa osaa aiheesta unset kohteesta https://unix.stackexchange.com/a/381782/674

unset sisään bash 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, onko unset -muuttuja paitsi asetettu myös ilmoittamaton?

    Jos unset muuttuja, joka on globaalissa laajuudessa, onko unset -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:

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *