Cosa fa unset?

Sto cercando di capire la parte seguente su unset da https://unix.stackexchange.com/a/381782/674

unset in bash 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, la unset variabile non è solo non impostata ma anche non dichiarata?

    Se unset una variabile che si trova nellambito globale, è la variabile unset 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:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *