qual é o equivalente zsh da exportação de bash -f

20

Então comecei a usar zsh . Eu gosto disso tudo bem. Parece muito legal e liso, e o fato de que o diretório de trabalho atual e a linha de comando atual estão em linhas diferentes é bom, mas, ao mesmo tempo, estou percebendo que zsh pode ser um pouco mais lento que bash , especialmente ao imprimir texto na tela.

A coisa que eu mais gostei foi o fato de que zsh era 'compatível com versões anteriores' com todas as funções que defini no meu .bashrc .

Uma queixa embora. Todas as funções funcionam perfeitamente, mas não consigo descobrir como funciona o sistema de exportação.

Eu tinha algumas dessas funções .bashrc exportadas para que eu pudesse usá-las em outro lugar, como em scripts e programas externos, com export -f .

Em zsh, a exportação nem parece ser comentada. É autoloading? Essas duas coisas são iguais? Estou tendo muita dificuldade em descobrir isso.

    
por ixtmixilix 25.12.2012 / 01:54

2 respostas

11

Variáveis de ambiente contendo funções são um hack básico. Zsh não tem nada parecido. Você pode fazer algo semelhante com algumas linhas de código. Variáveis de ambiente contêm strings; versões antigas do bash, antes do Shellshock ser descoberto, armazenado o código da função em uma variável cujo nome é o da function 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 semelhantes a bash. Observe que zsh não pode emular todos os recursos bash, tudo o que você pode fazer é aproximar-se um pouco (por exemplo, para tornar $foo o valor dividido e expandir curingas e tornar as 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 Stéphane Chazelas , o descobridor original de Shellshock, observou, uma versão anterior A versão desta resposta poderia executar código arbitrário neste momento se a definição da função foi malformada.Esta versão não faz, mas é claro que assim que você executar qualquer comando, pode ser uma função importada do ambiente.

Versões pós-Shellshock de funções de codificação bash no ambiente usando nomes de variáveis inválidos (por exemplo, BASH_FUNC_myfunc%% ). Isso dificulta a análise confiável, já que o zsh não fornece uma interface para extrair esses nomes de variáveis do ambiente.

Eu não recomendo fazer isso. Confiar em funções exportadas em scripts é uma má ideia: cria uma dependência invisível em seu script. Se você já executou seu script em um ambiente que não tem sua função (em outra máquina, em uma tarefa cron, depois de alterar seus 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 estão contando com isso. Se você copiar um script, poderá descobrir facilmente quais arquivos auxiliares ele precisa.

Zsh (e ksh antes dele) torna isso mais conveniente, fornecendo uma maneira de carregar automaticamente funções em scripts nos quais elas são usadas. A restrição é que você só pode colocar uma função por arquivo. Declare a função como autoloaded e coloque a definição da função em um arquivo cujo nome é o nome da função. Coloque este arquivo em um diretório listado em $fpath (que você pode configurar através da variável de ambiente FPATH ). Em seu script, declare as funções carregadas automaticamente com autoload -U foo .

Além disso, o zsh pode compilar scripts para economizar tempo de análise. Chame zcompile para compilar um script. Isso cria um arquivo com a extensão .zwc . Se esse arquivo estiver presente, autoload carregará o arquivo compilado em vez do código-fonte. Você pode usar a função zrecompile para (re) compilar toda a função definições em um diretório.

    
por 26.12.2012 / 00:58
4

Se você colocar sua declaração de função em .zshenv , sua função será utilizável de um script sem nenhum esforço.

    
por 24.11.2017 / 12:27