No Ubuntu 16.04, tenho um arquivo Bash contendo algumas funções diferentes para automatizar várias tarefas comuns em meu sistema.
Eu criei esse arquivo bashrc
para que eu pudesse chamar confortavelmente cada função de qualquer lugar no terminal em tempo de necessidade, portanto, podemos dizer que "as funções em si são originadas".
Às vezes, preciso usar uma dessas funções originadas de dentro de um script e preciso preparar essa ação com:
export -f myFunc_0 myFunc_1 myFunc_2 ...
caso contrário, não poderei usar essas funções.
Como eu poderia fazer esse priming para todas as funções do arquivo, sem anotar funções específicas?
Se você usar
set -a
no seu.bashrc
ou dentro do próprio arquivo de função, ele marcará todas as funções a serem exportadas.Isso pode causar alguns resultados indesejáveis se você estiver definindo variáveis que não deseja exportar, mas pode adicionar algo assim ao seu
.bashrc
:O que você realmente deve fazer é obter o arquivo contendo as funções dentro do próprio script, dessa forma não será dependente do contexto (ou melhor, será menos dependente do contexto).
Você poderia tentar algo como:
Como você deseja exportar apenas funções do arquivo, localizá-lo em uma nova instância do bash e, em seguida, usar
compgen -A function
listará os nomes de todas as funções definidas nesse arquivo (e funções exportadas anteriormente também, mas isso não deve ser um problema aqui) . Então você pode usar a saída disso comexport -f
oudeclare -fx
para exportar essas funções.Como você está obtendo o arquivo em seu bashrc, recuperá-lo provavelmente não será um problema.
Dê uma olhada em BASH_ENV
Quando o bash executa um script de shell de forma não interativa, o .bashrc não é lido e o arquivo de função não é originado.
Se BASH_ENV for definido como o nome do arquivo de função, este arquivo é lido e executado como dito em INVOCATION.
Portanto, não há necessidade de fornecer o arquivo de função em cada script de shell que usa a função.
Exemplo para ilustrar:
Não Ubuntu, mas debian-linux 4.14.0-3-amd64 #1 SMP Debian 4.14.17-1 (2018-02-14) x86_64 GNU/Linux com Xfce 4.12
Crie um arquivo de funções em seu
$HOME
Crie um script que use a função
aqui a fonte do script o arquivo de função
Crie um laucher para
lescript
noDesktop
Não há necessidade de terminal
execute.
O arquivo
~/lapiste
é atualizado.Agora remova
. ~/mesfuncbash
delescript
execute
O arquivo
~/lapiste
não é atualizado.Se você executar
lescript
em um terminalBash te diz:
Agora você deve definir
BASH_ENV
o nome do arquivo de função.No debian com xfce,
.profile
não é lido na inicialização, então você não pode usá-lo para definir arquivosBASH_ENV
.Você deve criar um arquivo
.xsessionrc
em seu$HOME
.logout e login, desta forma
.xsessionrc
é lido na inicializaçãoAgora, você pode executar o iniciador na área de trabalho e o arquivo
~/lapiste
é atualizado.A saída de
set
parece ser classificada favoravelmente para extrair todas as funções definidas. Começa com variáveis e depois mostra funções, por exemplo:Isso procura a primeira não atribuição (uma ocorrência
()
antes da primeira=
) e diz que não há problema em imprimir. A segunda estrofe do awk usa a ação de impressão padrão quando a variávelfunctions
é verdadeira. A saída é salva emfunctions.sh
, que pode ser obtida em outro lugar.Basta usar o
env
comando: