Dopo aver letto 24.2. Variabili locali , ho pensato che dichiarare una variabile var
con la parola chiave local
significasse che var
il 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 var
si può accedere anche, letti e scritti dalle funzioni invocate da quel blocco di codice - vale a dire, anche se var
è dichiarato local
a 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.
var
sia vuoto? var
è impostato a livello globale innerFunc
, quindi perché non si attacca fino alla fine della sceneggiatura?