Como “exportar” funções no bash?

Como “exportar” funções no bash?

Eu tenho um script que contém muitas funções.

meuarquivo1.sh:

func1() {}

func2() {}

Posso chamá-los do script com:

meuarquivo2.sh:

source myfile1.sh

func1

func2

Mas como posso chamá-los se originados em script aninhado?

meuarquivo3.sh:

./myfile2.sh

func2

func2: command not found

Posso "exportar" funções myfile2para que todos as conheçam?

Não consigo usar export -fporque tem muitas funções.

Responder1

Observe que bashnão é sh. export -fé específico para o bashshell.

Se um script não tiver um she-bang, ele será interpretado por um shell tipo POSIX que pode não ser bash. Se você pretende usar bashrecursos específicos em seu script, verifique se ele possui:

#! /path/to/bash -

she-bang ou que você o invoque como bash path/to/the/script. Também fornecer .shextensões para scripts escritos na bashlinguagem é um pouco enganador.

Now bashé um daqueles poucos shells que são capazes de exportar funções para o ambiente (na verdade, usando variáveis ​​de ambiente especiais compreendidas bashapenas por comandos). Isso pode ser feito usando o export -fcomando específico do bash. bashtambém exporta todas as funções declaradas enquanto a allexportopção está ativada.

Mas, em qualquer caso, nenhum deles funcionaria no seu caso. exportusar algo de um shell, seja uma variável ou função, é para que essa variável/função esteja disponível em outros shells que esse shellexecuta(exportar é preservar coisas atravésexecução).

Portanto, mesmo que myfile1.shou myfile2.shexportasse as funções que declararam (com export -fou tendo um set -o allexportantes da declaração da variável), isso afetaria apenas os shells que o shell que interpreta esses scripts executaria. Aqui myfile2.shnão está executando myfile3.sh, é o contrário.

Aqui você precisa do seu myfile3.shscript para fazer:

source path/to/myfile2.sh

para que seja o mesmo shell que interpreta o código em todos os scripts e myfile1.sh, e então você não precisará exportar nenhuma função.myfile2.shmyfile3.sh

Observe que em sistemas onde shis bash, provavelmente não é uma boa ideia exportar funções, pois isso afeta todos os scripts sh e bash e linhas de comando do shell que seu script executa (recursivamente). Por exemplo, se você fez:

set -o allexport
uname() { echo Gotcha; }
somecmd

E somecmdestava fazendo um popen("uname", "r")para pegar o nome unix, ele iria entrar Gotchanos sistemas onde shestá bashao invés do nome real do sistema ( Darwin, Linux...).

informação relacionada