Après avoir lu 24.2. Variables locales , je pensais que déclarer une variable var
avec le mot-clé local
signifiait que sa var
valeur n'était accessible que dans le bloc de code délimité par les accolades d'une fonction.
Cependant, après l' exécution de l'exemple suivant, j'ai découvert que var
peut également être consulté, lu et écrit des fonctions invoquées par ce bloc de code - à savoir même si var
est déclarée local
à outerFunc
, innerFunc
est encore capable de le lire et de modifier sa valeur.
#!/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}]"
Sortie:
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:]
Q: Est-ce un bug dans mon shell (bash 4.3.42, Ubuntu 16.04, 64bit) ou est-ce le comportement attendu?
EDIT: Résolu. Comme l'a noté @MarkPlotnick, c'est en effet le comportement attendu.
var
soit vide? var
est défini globalement innerFunc
, alors pourquoi ne reste-t-il pas jusqu'à la fin du script?