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