Después de leer 24.2. Variables locales , pensé que declarar una variable var
con la palabra clave local
significaba que var
solo se podía acceder al valor dentro del bloque de código delimitado por las llaves de una función.
Sin embargo, después de ejecutar el siguiente ejemplo, descubrí que var
también se puede acceder, leídos y escritos desde las funciones invocadas por ese bloque de código - es decir, a pesar de que var
se declara local
a outerFunc
, innerFunc
todavía es capaz de leer y alterar su valor.
#!/usr/bin/env bash
function innerFunc() {
var='new value'
echo "innerFunc: [var:${var}]"
}
function outerFunc() {
local var='initial value'
echo "outerFunc: before innerFunc: [var:${var}]"
innerFunc
echo "outerFunc: after innerFunc: [var:${var}]"
}
echo "global: before outerFunc: [var:${var}]"
outerFunc
echo "global: after outerFunc: [var:${var}]"
Salida:
global: before outerFunc: [var:] # as expected, `var` is not accessible outside of `outerFunc`
outerFunc: before innerFunc: [var:initial value]
innerFunc: [var:new value] # `innerFunc` has access to `var` ??
outerFunc: after innerFunc: [var:new value] # the modification of `var` by `innerFunc` is visible to `outerFunc` ??
global: after outerFunc: [var:]
P: ¿Es un error en mi shell (bash 4.3.42, Ubuntu 16.04, 64 bits) o es el comportamiento esperado?
EDITAR: Resuelto. Como señaló @MarkPlotnick, este es de hecho el comportamiento esperado.
var
esté vacío? var
está configurado globalmente innerFunc
, entonces ¿por qué no se mantiene hasta el final del guión?