sudo executa comandos diretamente, não por meio de um shell, e mesmo se ele executasse um shell para executar esse comando, seria uma nova invocação de shell e não uma que lê seu ~/.zshrc (mesmo que tenha iniciado um Como o shell interativo, ele provavelmente leu root ~/.zshrc , não seu, a menos que você tenha configurado sudo para não redefinir a variável $HOME ).
Aqui, você precisa informar sudo para iniciar um novo zsh shell e informar que zsh ler seu ~/.zshrc antes de executar essa função:
sudo zsh -c '. $0; "$@"' ~/.zshrc findPort 3306
Ou:
sudo zsh -c '. $0; findPort 3306' ~/.zshrc
Ou para compartilhar suas funções zsh atuais com o novo zsh chamado por sudo :
sudo zsh -c "$(functions); findPort 3306"
Embora você possa ter um erro lista de arges por muito tempo se você tiver muitas funções definidas (como ao usar o sistema de conclusão). Então você pode querer limitá-lo para a função findPort (e todas as outras funções nas quais ele se baseia):
sudo zsh -c "$(functions findPort); findPort 3306"
Você também pode fazer:
sudo zsh -c "(){$functions[findPort]} 3306"
Para incorporar o código da função findPort em uma função anônima para a qual você passa o argumento 3306. Ou até mesmo:
sudo zsh -c "$functions[findPort]" findPort 3306
(o script in-line passado para -c é o corpo da função).
Você pode usar uma função auxiliar como:
zsudo() sudo zsh -c "$functions[$1]" "$@"
Não use:
sdo() { sudo zsh -c "(){$functions[$1]} ${@:2}" }
Como os argumentos de sdo passariam por outro nível de análise de shell. Comparar:
$ e() echo "$@"
$ sdo e 'tname;uname'
tname
Linux
$ zsudo e 'tname;uname'
tname;uname