Depois de ler 24.2. Variáveis locais , pensei que declarar uma variável var
com a palavra-chave local
significava que var
o valor de s só era acessível dentro do bloco de código delimitado pelas chaves de uma função.
No entanto, depois de executar o exemplo a seguir, descobri que var
também pode ser acessado, lido e escrito das funções invocadas por esse bloco de código - ou seja, mesmo que var
seja declarada local
a outerFunc
, innerFunc
ainda é capaz de lê-lo e alterar seu 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}]"
Saída:
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: Isso é um bug no meu shell (bash 4.3.42, Ubuntu 16.04, 64bit) ou é o comportamento esperado?
EDIT: resolvido. Conforme observado por @MarkPlotnick, esse é realmente o comportamento esperado.
var
esteja vazio? var
está definido globalmente innerFunc
, então por que não permanece até o final do script?