Eu tenho um arquivo bash src-useful.bash
, contendo funções úteis como say_hello()
, localizadas em / path / to / useful.
No meu ~/.bash_profile
eu adicionei as seguintes linhas:
export BASH_USEFUL=/path/to/useful
source $BASH_USEFUL/src-useful.bash
Abrindo um novo terminal, posso verificar o seguinte:
$ echo $BASH_USEFUL
/path/to/useful
$ cat $BASH_USEFUL/src-useful.bash
function hello() {
echo "hello!"
}
$ hello
hello!
Eu criei um script say_hello.sh
:
$ cat say_hello.sh
echo "BASH_USEFUL: $BASH_USEFUL"
hello
$ ./say_hello.sh
BASH_USEFUL: /path/to/useful # Recognizsed
say_hello.sh: line 2: say_hello: command not found # Not recognized?
Se eu source $BASH_USEFUL/src-useful.bash
em say_hello.sh
que vai funcionar no entanto:
$ cat say_hello.sh
echo "BASH_USEFUL: $BASH_USEFUL"
source $BASH_USEFUL/src-useful
say_hello
$ ./say_hello.sh
BASH_USEFUL: /path/to/useful # Recognized
hello! # Function say_hello is now recognized
Gostaria de saber por que a variável BASH_USEFUL
ainda é reconhecida pelo meu script, enquanto as funções do meu arquivo de origem não podem ser vistas no ambiente pelo meu script em execução. Existe uma solução alternativa, além de fornecer meus src-useful.bash
em meus scripts? Gostaria que src-useful.bash
as funções fossem carregadas no ambiente de qualquer script iniciado.
hello()
parasay_hello()
nas etapas acima ...Respostas:
Somente itens de ambiente exportados são copiados para novos ambientes filho. Você exportou
BASH_USEFUL
para que este env-var seja copiado para o seu./say_hello.sh
subprocesso conforme o esperado. Mas você não fez o mesmo com sua função,hello()
que é um símbolo local simples que não deve ser copiado em novos ambientes filho.A sintaxe para exportar funções usando o bash usa o
-f
argumento deexport
:fonte
export -f
corpo após cada função, ou 2) adicionar umMYSCRIPT_FUNCS="${MYSCRIPT_FUNCS} foo"
corpo após cada função com uma função auxiliar extramyscript_export_all()
que chamaexport -f
todos os tokens dessa variável, por exemplo. E importe esse script usando uma sintaxe comosource myscript.sh && myscript_export_all
.