Sto cercando di capire la parte seguente su unset
da https://unix.stackexchange.com/a/381782/674
unset
inbash
annulla limpostazione di una variabile solo se è stata dichiarata nellambito corrente ( lo lascia dichiarato però tranne che nellambito globale ; rimuove attributi e valori e la variabile non è più array o hash; inoltre notare che su namerefs, annulla la variabile di riferimento). Altrimenti, viene visualizzato solo un livello variabile dalla pila di cui sopra.
Il manuale di Bash non menziona nulla di correlato, o mi manca.
Potresti spiegare con esempi per
- “disimposta una variabile solo se è stato dichiarato nellambito corrente “
-
” lo lascia tuttavia dichiarato eccetto nellambito globale “.
Se
unset
una variabile che si trova nellambito locale di una funzione, launset
variabile non è solo non impostata ma anche non dichiarata?Se
unset
una variabile che si trova nellambito globale, è la variabileunset
appena non impostata ma ancora dichiarata?Come posso verificare se una variabile è dichiarato o no?
-
“Altrimenti, estrae solo un livello variabile dalla pila di cui sopra.”
Cosa significano “altrimenti” e “uno strato variabile”?
Grazie.
Risposta
Meglio con esempi:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
Quella “s unset
ha richiamato una variabile dichiarata nello stesso ambito. È correttamente non impostata. È ancora dichiarato (sebbene abbia perso attributi e valore), è ancora limitato a tale ambito. Come puoi vedere, anche se eseguiamo un a=2
, viene comunque eseguito su un a
local a f
, quello dallambito esterno non è interessato. Questo è buono e quello che vogliamo.
In:
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
Puoi vedere che unset a
non ha “t annullato a
. Invece, ha rivelato quello sotto, quello dallambito esterno. Quando restituisce g
, la variabile f
“s a
non sarà più locale.
In bash 5+, questo può essere risolto impostando lopzione localvar_unset
.
Nota che è anche peggio in mksh
e yash
dove unset
fa scoppiare invece di disinserire anche per le variabili che sono state dichiarate nello stesso ambito. Il primo esempio con loro fornisce:
typeset a=0 2
Ulteriori letture su: