Wat doet uitschakelen?

Ik probeer het volgende deel te begrijpen over unset van https://unix.stackexchange.com/a/381782/674

unset in bash schakelt alleen een variabele uit als deze is gedeclareerd in het huidige bereik ( laat het gedeclareerd, behalve in het globale bereik ; het verwijdert attributen en waarden en de variabele is niet langer een array of hash; ook merk op dat het op naamfactoren de variabele waarnaar wordt verwezen uitschakelt). Anders springt het gewoon een variabele laag uit de hierboven genoemde stapel.

Bash-handleiding vermeldt niets gerelateerd, of ik mis het.

Kun je uitleggen met voorbeelden voor

  • “schakelt alleen een variabele uit als het is gedeclareerd in het huidige bereik “
  • ” laat het gedeclareerd, behalve in het globale bereik “.

    If unset een variabele die zich in het lokale bereik van een functie bevindt, is de unset variabele niet alleen uitgeschakeld maar ook niet aangegeven?

    Als unset een variabele die zich in de globale scope bevindt, is de unset variabele net uitgeschakeld maar nog steeds gedeclareerd?

    Hoe kan ik controleren of een variabele is verklaard of niet?

  • “Anders springt het gewoon een variabele laag uit de hierboven genoemde stapel.”

    Wat betekenen “anders” en “één variabele laag”?

Bedankt.

Antwoord

Beste met voorbeelden:

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

Dat “s unset heeft aangeroepen op een variabele die in hetzelfde bereik is gedeclareerd. Het is correct uitgeschakeld. Het is nog steeds gedeclareerd (hoewel het attributen en waarde heeft verloren), het is nog steeds beperkt tot dat bereik. U ziet dat, hoewel we een a=2 doen, dit nog steeds wordt gedaan op een a lokaal naar f, die van de buitenste scope wordt niet beïnvloed. Dat is goed en wat we willen.

In:

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

U kunt zien dat unset a heeft a niet uitgeschakeld. In plaats daarvan onthulde het degene eronder, die van de buitenste scope. Wanneer g retourneert, f “s a variabele zal niet langer lokaal zijn.

In bash 5+ kan dat worden opgelost door de optie localvar_unset in te stellen.

Merk op dat het nog erger is in mksh en yash waarbij unset dat popping doet in plaats van uit te schakelen zelfs voor variabelen die binnen hetzelfde bereik zijn gedeclareerd. Het eerste voorbeeld met hen geeft:

typeset a=0 2 

Verder lezen op:

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *