Este é mais um exercício acadêmico, mas curioso da resposta. Aqui está o código atual em questão:
export original_command_not_found_handler="$(type -f command_not_found_handler)" # original func as string
function command_not_found_handler(){ # my custom override
echo "my custom handler: $@"
echo "
${original_command_not_found_handler}
command_not_found_handler "$@"
" | bash
}
o que estou tentando fazer é substituir a função zsh original pela minha função personalizada e, em seguida, chamar a função original da substituição.
Há dois problemas com este código:
- Estou tentando chamar a função original de um subshell (piping para bash), mas seria melhor chamar do shell atual e não do subshell.
- não funciona, pois a função original não está sendo interpretada como desejado na string.
Em
zsh
, as funções e suas definições são expostas no$functions
array associativo especial, então para fazer uma cópia de uma função, basta fazer:Em
bash
, você pode fazer:(mas cuidado que o bash teve vários bugs onde
typeset -f
não mostra a definição da função corretamente em alguns casos de canto; em teoria, o mesmo poderia acontecer comzsh
's$functions
)Então, em ambos, você faz:
(no bash, substitua
handler
porhandle
)Agora, isso significa que você não pode fazer isso mais de uma vez ou precisará escolher um nome diferente para o manipulador original salvo a cada vez. Em vez disso, você pode incorporar o código da função original dentro do seu personalizado, como mostrei nas perguntas e respostas, este é um acompanhamento do .