Chame as funções do arquivo originado no script bash

2

Eu tenho um arquivo bash, src-useful.bash , contendo funções úteis como say_hello() , localizado em / path / to / useful.

No meu ~/.bash_profile , 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 localizar $BASH_USEFUL/src-useful.bash em say_hello.sh , funcionará:

$ 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

Eu 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 de execução. Existe uma solução alternativa além de obter meu src-useful.bash em meus scripts? Eu gostaria que as funções de src-useful.bash fossem carregadas no ambiente de qualquer script que eu lançasse.

    
por kaligne 12.07.2016 / 15:19

1 resposta

3

Somente itens de ambiente exportados são copiados para novos ambientes filho. Você exportou BASH_USEFUL para que esse env-var seja copiado para seu processo ./say_hello.sh sub conforme o esperado. Mas você não fez o mesmo com a sua função hello() , que é um símbolo local simples para não ser copiado em novos ambientes filhos.

A sintaxe para exportar funções usando o bash usa o argumento -f de export :

export -f hello
    
por 12.07.2016 / 22:21