Après avoir lu 24.2. Variables locales , je pensais que déclarer une variable varavec le mot-clé localsignifiait que sa varvaleur 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 varpeut également être consulté, lu et écrit des fonctions invoquées par ce bloc de code - à savoir même si varest déclarée localà outerFunc, innerFuncest 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.
varsoit vide? varest défini globalement innerFunc, alors pourquoi ne reste-t-il pas jusqu'à la fin du script?