AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 428175
Accepted
user9303970
user9303970
Asked: 2018-03-05 21:16:26 +0800 CST2018-03-05 21:16:26 +0800 CST 2018-03-05 21:16:26 +0800 CST

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

  • 772

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 bashrcpara 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?

bash bash-functions
  • 6 6 respostas
  • 7278 Views

6 respostas

  • Voted
  1. Best Answer
    jesse_b
    2018-03-17T13:55:01+08:002018-03-17T13:55:01+08:00

    Se você usar set -ano seu .bashrcou dentro do próprio arquivo de função, ele marcará todas as funções a serem exportadas.

    4.3.1 O Conjunto Embutido

    -uma

    Cada variável ou função criada ou modificada recebe o atributo de exportação e é marcada para exportação para o ambiente de comandos subsequentes.

    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:

    set -a
    source ~/my_funcs
    set +a
    
    • 13
  2. Stephen Kitt
    2018-03-05T21:19:02+08:002018-03-05T21:19:02+08:00

    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).

    • 8
  3. Olorin
    2018-03-05T21:36:32+08:002018-03-05T21:36:32+08:00

    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, localizá-lo em uma nova instância do bash e, em seguida, usar compgen -A functionlistará 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 com export -fou declare -fxpara exportar essas funções.

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

    • 7
  4. ctac_
    2018-03-19T02:00:58+08:002018-03-19T02:00:58+08:00

    Dê uma olhada em 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 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

    cat mesfuncbash

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

    Crie um script que use a função

    script de gato

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

    aqui a fonte do script o arquivo de função

    Crie um laucher para lescriptnoDesktop

    Não há necessidade de terminal

    execute.

    O arquivo ~/lapisteé atualizado.

    Agora remova . ~/mesfuncbashdelescript

    execute

    O arquivo ~/lapistenão é atualizado.

    Se você executar lescriptem um terminal

    Bash te diz:

    line 3: piste: command not found
    

    Agora você deve definir BASH_ENVo nome do arquivo de função.

    No debian com xfce, .profilenão é lido na inicialização, então você não pode usá-lo para definir arquivos BASH_ENV.

    Você deve criar um arquivo .xsessionrcem seu $HOME.

    cat .xsessionrc

    export BASH_ENV="$HOME/mesfuncbash"
    

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

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

    • 3
  5. Adam Katz
    2018-03-20T09:10:34+08:002018-03-20T09:10:34+08:00

    A saída de setparece ser classificada favoravelmente para extrair todas as funções definidas. Começa com variáveis ​​e depois mostra funções, por exemplo:

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

    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ável functionsé verdadeira. A saída é salva em functions.sh, que pode ser obtida em outro lugar.

    • 0
  6. pvod
    2018-03-17T14:46:17+08:002018-03-17T14:46:17+08:00

    Basta usar o envcomando:

    env > /path/to/file
    
    • -2

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve