Em bash
(e ksh88
, mksh
, yash
, dash
, zsh
), o escopo da variável local é dinâmico.
Este código:
f() { a=2; echo "f: $a"; }
g() { local a=1; f; echo "g: $a"; }
a=0
g
echo "global: $a"
produz esta saída:
f: 2
g: 2
global: 0
Essa é a variável f
das g
updates $a
, porque é chamada de g
.
Isso está em contraste com as variáveis declaradas com typeset
em funções declaradas com a sintaxe ksh
( function f { ...; }
) em ksh93
ou variáveis declaradas com private
em zsh
onde você obteria um:
f: 2
g: 1
global: 2
Então, nesse caso, você não precisa fazer nada.
Para saber o nome da função que está chamando você, em bash
, você pode usar ${FUNCNAME[1]}
.
O zsh
equivalente é $funcstack[2]
:
$ zsh -c 'f() { echo $funcstack[2]; }; g() { f; }; g'
g
$ bash -c 'f() { echo "${FUNCNAME[1]}"; }; g() { f; }; g'
g