Variáveis de ambiente que contêm funções são um hack do bash. Zsh não tem nada parecido. Você pode fazer algo semelhante com algumas linhas de código. Variáveis de ambiente contêm seqüências de caracteres; As versões mais antigas do bash, antes da descoberta do Shellshock , armazenavam o código da função em uma variável cujo nome é o da função e cujo valor é () {
seguido pelo código da função seguido por }
. Você pode usar o código a seguir para importar variáveis com essa codificação e tentar executá-las com configurações do tipo bash. Observe que o zsh não pode emular todos os recursos do bash, tudo o que você pode fazer é se aproximar um pouco (por exemplo, para $foo
dividir o valor e expandir curingas e criar matrizes baseadas em 0).
bash_function_preamble='
emulate -LR ksh
'
for name in ${(k)parameters}; do
[[ "-$parameters[name]-" = *-export-* ]] || continue
[[ ${(P)name} = '() {'*'}' ]] || continue
((! $+builtins[$name])) || continue
functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"}
done
(Como observou Stéphane Chazelas , o descobridor original do Shellshock, uma versão anterior desta resposta poderia executar código arbitrário nesse momento se a definição da função estivesse malformada. Essa versão não funciona, mas é claro, assim que você executa qualquer comando, pode ser uma função importada do ambiente.)
As versões pós-Shellshock do bash codificam funções no ambiente usando nomes de variáveis inválidos (por exemplo BASH_FUNC_myfunc%%
). Isso dificulta a análise confiável, pois o zsh não fornece uma interface para extrair esses nomes de variáveis do ambiente.
Eu não recomendo fazer isso. Confiar nas funções exportadas dos scripts é uma péssima idéia: cria uma dependência invisível no seu script. Se você executar seu script em um ambiente que não tem sua função (em outra máquina, em um trabalho cron, após alterar os arquivos de inicialização do shell, ...), seu script não funcionará mais. Em vez disso, armazene todas as suas funções em um ou mais arquivos separados (algo como ~/lib/shell/foo.sh
) e inicie seus scripts importando as funções que ele usa ( . ~/lib/shell/foo.sh
). Dessa forma, se você modificar foo.sh
, poderá pesquisar facilmente quais scripts contam com ele. Se você copiar um script, poderá descobrir facilmente quais arquivos auxiliares ele precisa.
O Zsh (e o ksh antes dele) torna isso mais conveniente, fornecendo uma maneira de carregar automaticamente funções nos scripts em que são usadas. A restrição é que você pode colocar apenas uma função por arquivo. Declare a função como carregada automaticamente e coloque a definição da função em um arquivo cujo nome é o nome da função. Coloque esse arquivo em um diretório listado em $fpath
(que você pode configurar através da FPATH
variável de ambiente). No seu script, declare funções carregadas automaticamente com autoload -U foo
.
Além disso, o zsh pode compilar scripts, para economizar tempo de análise. Ligue zcompile
para compilar um script. Isso cria um arquivo com a .zwc
extensão Se esse arquivo estiver presente, autoload
será carregado o arquivo compilado em vez do código-fonte. Você pode usar a zrecompile
função para (re) compilar todas as definições de função em um diretório.