Dopo aver letto 24.2. Variabili locali , ho pensato che dichiarare una variabile varcon la parola chiave localsignificasse che varil valore era accessibile solo all'interno del blocco di codice delimitato dalle parentesi graffe di una funzione.
Tuttavia, dopo aver eseguito il seguente esempio, ho scoperto che varsi può accedere anche, letti e scritti dalle funzioni invocate da quel blocco di codice - vale a dire, anche se varè dichiarato locala outerFunc, innerFuncè ancora in grado di leggere e modificare il suo valore.
#!/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}]"
Produzione:
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:]
D: È un bug nella mia shell (bash 4.3.42, Ubuntu 16.04, 64bit) o è il comportamento previsto?
EDIT: risolto. Come notato da @MarkPlotnick, questo è davvero il comportamento previsto.
varsia vuoto? varè impostato a livello globale innerFunc, quindi perché non si attacca fino alla fine della sceneggiatura?