Como exportar todas as funções do Bash em um arquivo em uma linha?

4

No Ubuntu 16.04 eu tenho um arquivo Bash contendo algumas funções diferentes para automatizar várias tarefas comuns no meu sistema.

Eu obtive esse arquivo em bashrc para poder chamar confortavelmente cada função de qualquer lugar do terminal em um momento de necessidade, portanto, podemos dizer que "as próprias funções são originadas".

Às vezes, preciso usar uma dessas funções de origem de dentro de um script e preciso prim esta ação com:

export -f myFunc_0 myFunc_1 myFunc_2 ...

caso contrário, não serei capaz de usar essas funções.

Como eu poderia fazer esse priming para todas funções no arquivo, sem notar funções específicas?

    
por user9303970 05.03.2018 / 06:16

6 respostas

5

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.

4.3.1 The Set Builtin

-a

Each variable or function that is created or modified is given the export attribute and marked for export to the environment of subsequent commands.

Isso pode causar alguns resultados indesejáveis se você estiver configurando variáveis que não deseja exportar, mas você pode adicionar algo assim ao seu .bashrc :

set -a
source ~/my_funcs
set +a
    
por 16.03.2018 / 22:55
8

O que você realmente deve fazer é pesquisar o arquivo que contém as funções dentro do próprio script. Dessa forma, ele não depende do contexto (ou melhor, dependerá menos do contexto).

    
por 05.03.2018 / 06:19
6

Você poderia tentar algo como:

declare -fx $(bash -c 'source /path/to/my-file &> /dev/null; compgen -A function')

Como você deseja exportar apenas funções do arquivo, obtê-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 também as funções anteriormente exportadas, mas isso não deve acontecer) t ser um problema aqui). Em seguida, você pode usar a saída disso com export -f ou declare -fx para exportar essas funções.

Como você está pesquisando o arquivo em seu bashrc, reenviá-lo provavelmente não será um problema.

    
por 05.03.2018 / 06:36
2

Dê uma olhada no BASH_ENV

INVOCATION
          When bash is started non-interactively, to  run  a  shell script,  for
          example, it looks for the variable BASH_ENV in the environment, expands
          its value if it appears there, and uses the expanded value as the  name
          of  a  file to read and execute.  Bash behaves as if the following com‐
          mand were executed:
          if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
          but the value of the PATH variable is not used to search for the  file‐
          name.

  BASH_ENV
          If  this parameter is set when bash is executing a shell script,
          its value is interpreted as a filename  containing  commands  to
          initialize the shell, as in ~/.bashrc.  The value of BASH_ENV is
          subjected to  parameter  expansion,  command  substitution,  and
          arithmetic  expansion  before  being  interpreted as a filename.
          PATH is not used to search for the resultant filename.

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 é definido como o nome do arquivo de função, esse arquivo é lido e executado como dito em INVOCATION.
Portanto, não é necessário criar 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 no seu $HOME

cat mesfuncbash

piste ()
{
echo $0 >> ~/lapiste
date >> ~/lapiste
}

Crie um script que use a função

cat lescript

#!/bin/bash
echo $0
. ~/mesfuncbash
piste
echo fin

aqui o script fonte do arquivo de função

Crie um laucher para lescript no Desktop

Não há necessidade de terminal

execute-o.

O arquivo ~/lapiste é atualizado.

Agora, remova . ~/mesfuncbash de lescript

execute-o

O arquivo ~/lapiste não é atualizado.

Se você executar lescript em um terminal

Bash lhe diz:

line 3: piste: command not found

Agora você deve definir BASH_ENV como 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 BASH_ENV .

Você deve criar um arquivo .xsessionrc no seu $HOME .

cat .xsessionrc

export BASH_ENV="$HOME/mesfuncbash"

logout e login, desta forma .xsessionrc é lido na inicialização

Agora, você pode executar o laucher na área de trabalho e o arquivo ~/lapiste é atualizado.

    
por 18.03.2018 / 11:00
0

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, soes:

set |awk '/^[^=()]*\(\)/ {functions=1} functions' > functions.sh

Isso procura pela primeira não atribuição (uma ocorrência de () antes do primeiro = ) e, em seguida, diz que não há problema em imprimir. A segunda sub-rotina awk usa a ação de impressão padrão quando a variável functions é verdadeira. A saída é salva em functions.sh , que pode ser obtida em outro lugar.

    
por 19.03.2018 / 18:10
-2

Basta usar o comando env :

env > /path/to/file
    
por 16.03.2018 / 23:46