Como tornar minha função bash conhecida pelo programa externo

1

Eu tenho funções bash foo e bar no meu ~/.bashrc .

A função foo chama um comando externo ext_command que toma como um dos seus argumentos outro comando. Eu quero passar bar como esse comando, ou seja, eu quero que meu .bashrc seja algo como isto:

bar() {
...
}
foo() {
 ext_command --invoke bar
} 

No entanto, isso não funciona, porque o comando externo, que não é um script de shell, não sabe bar . Como posso resolver isso?

Eu estava pensando em fazer

ext_command --invoke "bash -c 'bar'"

Mas o Bash nesta chamada não é executado como um shell interativo, por isso não sabe bar .

Por isso, acredito que uma maneira de resolver meu problema seria forçar o Bash a ser executado como um shell interativo; infelizmente eu não sei como fazer isso.

Outra maneira que eu pensei que deveria funcionar é usar

ext_command --invoke "bash -c 'source ~/.bashrc; bar'"

mas, por alguma razão, isso não funciona e, de fato, simplesmente rodando

bash -c 'source ~/.bashrc; bar'

em uma sessão bash interativa dá

bash: bar: command not found

De qualquer forma, não gosto dessa solução, porque gostaria que o foo funcionasse independentemente do arquivo de origem.

    
por Bananach 21.11.2018 / 09:41

1 resposta

3

Você geralmente tem esses caminhos a seguir:

  1. Reescreva a função para comando, ie. um script por conta própria. Uma prática comum é manter um diretório ~/bin e incluí-lo no seu $PATH .
  2. Exporte a função para o ambiente e faça a outra shell obtê-la de lá. Consulte Posso "exportar" funções no bash?
  3. Escolha bar como uma função de sourcable, mas a obtenção de ~/.bashrc talvez não seja a melhor solução. Você pode colocá-lo em seu próprio arquivo em ~/bin e obtê-lo a partir daí. Isso tornaria as coisas simples.
  4. Se possível, alimente a lógica para o ext_command na sua função foo de alguma outra forma, por exemplo. através de um aqui-doc.
por 21.11.2018 / 10:28