Em vez de restringir variáveis com subshells, você pode executar b
como um novo processo. Então, ele não terá acesso a nenhuma das variáveis do chamador, exceto aquelas que você escolheu exportar.
Mover função para um novo script
Se você precisar apenas de uma única função, mova toda a função para um script separado.
b
:
#!/usr/bin/env mksh
set -u -e -o pipefail
echo "in b: VAL= $val"
Saída:
in a: VAL= myval
./b[4]: val: parameter not set
Use uma função de wrapper
Se você tem muitas funções que precisam disso, você pode movê-las para um único arquivo e incluir uma função de wrapper para fornecer e executar.
funcs
:
#long options not passed on by -$-
set -o pipefail
#execute function without inheriting environment variables
function ni () {
WHERE="${_%/*}"
mksh -$- -c "source $WHERE/funcs ; $*"
}
function a () {
local +x val="myval"
echo "in a: VAL= $val"
ni b
}
function b () {
echo "in b: VAL= $val"
}
Esta "biblioteca" precisará ser source
d do script principal:
#!/usr/bin/env mksh
set -e -u -o pipefail
WHERE="${_%/*}"
source $WHERE/funcs
a
Isso tem a desvantagem de perder o local (o script e o número da linha) do erro:
in a: VAL= myval
mksh: val: parameter not set