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 myfile2
para que todos as conheçam?
Não consigo usar export -f
porque tem muitas funções.
Responder1
Observe que bash
não é sh
. export -f
é específico para o bash
shell.
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 bash
recursos 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 .sh
extensões para scripts escritos na bash
linguagem é 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 bash
apenas por comandos). Isso pode ser feito usando o export -f
comando específico do bash. bash
também exporta todas as funções declaradas enquanto a allexport
opção está ativada.
Mas, em qualquer caso, nenhum deles funcionaria no seu caso. export
usar 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.sh
ou myfile2.sh
exportasse as funções que declararam (com export -f
ou tendo um set -o allexport
antes da declaração da variável), isso afetaria apenas os shells que o shell que interpreta esses scripts executaria. Aqui myfile2.sh
não está executando myfile3.sh
, é o contrário.
Aqui você precisa do seu myfile3.sh
script 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.sh
myfile3.sh
Observe que em sistemas onde sh
is 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 somecmd
estava fazendo um popen("uname", "r")
para pegar o nome unix, ele iria entrar Gotcha
nos sistemas onde sh
está bash
ao invés do nome real do sistema ( Darwin
, Linux
...).