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.
a função exportada está disponível apenas para chamadas filhas? Como aplicá-lo à sessão bash atual? gosto de escrever .bashrc, mas apenas para a instância atual do bash ...
vp_arth
3
@vp_arth: Se você não precisa da função em chamadas filhas, não precisa exportá-la. Ele está disponível na sessão atual de qualquer maneira (observe que, se estiver definido em um arquivo, você precisará originar o arquivo em vez de executá-lo para torná-lo disponível na sessão atual).
Você pode usar a variável de ambiente FPATH, onde você pode colocar todas as suas funções.
Se FPATHfor 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 autoloadcomando em scripts de shell para carregar as funções de que precisa:
autoload fun_a fun_b
No zsh, autoloadé necessário para FPATHfuncionar. In kshe seus parentes próximos, acredito que ele simplesmente faz com que as funções definidas em FPATHsubstituam o comando regular em seu PATH, como fariam se fossem definidas diretamente.
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 .bashrcfuncionará dependendo dos detalhes da execução. Caso contrário, você poderia executar um script de invólucro que simplesmente faz um .ou sourcede 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.
Observe que isso é específico parabash . ( ksh'S contrapartida declare, typeset, tem uma -xopção, mas só se aplica a variáveis , e não funções; idem para zsh).
mklement0
0
As funções não são exportáveis por natureza. No entanto, você pode exportar strings, então tenho um pequeno truque aqui:
func="$(typeset -f funcname)"
export func
Para importar a função, redefina-a a partir da string exportada:
Respostas:
O
export -f
recurso é específico do Bash:pai
criança
fonte
Em
sh
, é não possível exportar uma função, como observado por Charles Duffy .fonte
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 noPATH
, 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:No zsh,
autoload
é necessário paraFPATH
funcionar. Inksh
e seus parentes próximos, acredito que ele simplesmente faz com que as funções definidas emFPATH
substituam o comando regular em seu PATH, como fariam se fossem definidas diretamente.Alguns detalhes sobre
FPATH
eautoload
:fonte
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.
ousource
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:
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.
fonte
Mais informações
fonte
bash
. (ksh
'S contrapartidadeclare
,typeset
, tem uma-x
opção, mas só se aplica a variáveis , e não funções; idem parazsh
).As funções não são exportáveis por natureza. No entanto, você pode exportar strings, então tenho um pequeno truque aqui:
Para importar a função, redefina-a a partir da string exportada:
fonte