Después de leer 24.2. Variables locales , pensé que declarar una variable varcon la palabra clave localsignificaba que varsolo 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 vartambién se puede acceder, leídos y escritos desde las funciones invocadas por ese bloque de código - es decir, a pesar de que varse declara locala outerFunc, innerFunctodaví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.
varesté vacío? varestá configurado globalmente innerFunc, entonces ¿por qué no se mantiene hasta el final del guión?