Diga-me como exportar uma função no shell pai (bash, sh ou ksh) para que a função esteja disponível para todos os processos filho iniciados a partir do processo pai.
Diga-me como exportar uma função no shell pai (bash, sh ou ksh) para que a função esteja disponível para todos os processos filho iniciados a partir do processo pai.
Respostas:
O export -f
recurso é específico do Bash:
pai
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
criança
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
Em sh
, é não possível exportar uma função, como observado por Charles Duffy .
Se você estiver usando ksh ou zsh:
Você pode usar a variável de ambiente FPATH
, onde você pode colocar todas as suas funções.
Se FPATH
for definido em um interpretador interativo, e um comando ou função não for encontrado no ambiente shell atual ou no PATH
, os diretórios listados lá são pesquisados quanto à existência de um arquivo com o nome do comando ausente. Se um for encontrado, é originado no ambiente shell atual e espera-se que defina a função.
Assim, você pode colocar todas as suas funções em um local no FPATH
, e os scripts filhos também poderão encontrá-lo.
Você pode usar o autoload
comando em scripts de shell para carregar as funções de que precisa:
autoload fun_a fun_b
No zsh, autoload
é necessário para FPATH
funcionar. In ksh
e seus parentes próximos, acredito que ele simplesmente faz com que as funções definidas em FPATH
substituam o comando regular em seu PATH, como fariam se fossem definidas diretamente.
Alguns detalhes sobre FPATH
e autoload
:
Se você criar subshells com ( )
, eles herdarão um instantâneo de todas as definições, parâmetros e variáveis de shell.
Se você os executar como programas, poderá inserir as definições .bashrc
.
Se você está tentando falsificar um script existente para executar um wrapper ou substituição para um comando PATH, então .bashrc
funcionará dependendo dos detalhes da execução. Caso contrário, você poderia executar um script de invólucro que simplesmente faz um .
ou source
de um arquivo de inclusão que define as funções e, em seguida, faz a mesma coisa com o script de shell com os comandos a serem substituídos.
O script de wrapper pode ser semelhante a:
script=$1
shift
. include.sh
. $script "$@"
A ideia é que o primeiro parâmetro seja o nome do script real e os parâmetros restantes sejam os args, então o script acima é executado.
declare -x -f NAME
Mais informações
-f restringir a ação ou exibir nomes e definições de funções -x para fazer a exportação de NAMEs
bash
. ( ksh
'S contrapartida declare
, typeset
, tem uma -x
opção, mas só se aplica a variáveis , e não funções; idem para zsh
).