Estoy tratando de comprender la siguiente parte sobre unset
de https://unix.stackexchange.com/a/381782/674
unset
enbash
solo desarma una variable si ha sido declarada en el alcance actual ( lo deja declarado aunque excepto en el ámbito global ; elimina atributos y valores y la variable ya no es matriz o hash; tenga en cuenta que en namerefs, desarma la variable referenciada). De lo contrario, solo aparece una capa variable de la pila mencionada anteriormente.
El manual de Bash no menciona nada relacionado, o lo extraño.
¿Podría explicar con ejemplos para
- «solo desarma una variable se ha declarado en el alcance actual «
-
» lo deja declarado, excepto en el alcance global «.
Si
unset
una variable que está en el alcance local de una función, ¿la variableunset
no solo no está definida sino también no declarada?Si
unset
una variable que está en el alcance global, ¿launset
variable está desarmada pero aún declarada?¿Cómo puedo verificar si una variable está ¿declarado o no?
-
«De lo contrario, solo saca una capa variable de la pila mencionada anteriormente».
¿Qué significan «de lo contrario» y «una capa variable»?
Gracias.
Responder
Mejor con ejemplos:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
Eso «s unset
llamado en una variable declarada en el mismo ámbito. Está correctamente desarmado. Todavía está declarado (aunque ha perdido atributos y valor), todavía está limitado a ese ámbito. Verá que aunque hacemos un a=2
, todavía se hace en un a
local a f
, el del ámbito externo no se ve afectado. Eso es bueno y lo que queremos.
En:
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
Puede ver que unset a
no desarmó a
. En cambio, reveló el que está debajo, el del alcance externo. Cuando g
regrese, la variable f
«s a
ya no será local.
En bash 5+, eso se puede solucionar configurando la opción localvar_unset
.
Tenga en cuenta que es aún peor en mksh
y yash
donde unset
hace que estalle en lugar de desarmar incluso para variables que se han declarado en el mismo ámbito. El primer ejemplo con ellos da:
typeset a=0 2
Más información en: