Tengo una función en mi ~/.zshrc:
findPort() {
lsof -t -i :$1
}
La invocación habitual es findPort 3306.
Quiero ejecutarlo con privilegios elevados. Pero me sale "comando no encontrado".
➜ git 🍔 sudo findPort 3306
sudo: findPort: command not found
Supongo que la razón es que el usuario raíz se ejecuta como un shell no interactivo (por lo tanto, no se refiere a un .zshrc) o se refiere a otro .zshrc .
He visto preguntas similares con aliasrespecto a las funciones definidas por el usuario, pero ninguna. Las respuestas a este problema aliasimplican agregar un alias a ~/.zshrc:
alias sudo='nocorrect sudo '
O quizás:
alias sudo='sudo '
He intentado ambas soluciones y el problema persiste (sí, he relanzado el shell).
También he intentado ejecutar sudo chshpara asegurarme de que mi shell raíz se ejecuta por debajo zsh. Ninguna de estas soluciones elimina el problema "comando no encontrado".
¿Hay alguna manera de ejecutar mis funciones definidas por el usuario en sudo?

Respuestas:
sudoejecuta comandos directamente, no a través de una concha, e incluso si se corrió una concha para ejecutar ese comando, sería una nueva llamada al shell, y no uno que lee sus~/.zshrc(incluso si se ha iniciado un shell interactivo, es probable que leerroot's~/.zshrc, no el suyo, a menos que haya configuradosudopara no restablecer la$HOMEvariable).Aquí, debe indicarle
sudoque inicie un nuevozshshell, y quezshlea su~/.zshrcantes de ejecutar esa función:O:
O para compartir sus funciones zsh actuales con las nuevas
zshinvocadas porsudo:Aunque puede obtener un error de lista arg demasiado larga si tiene muchas funciones definidas (como cuando usa el sistema de finalización). Por lo tanto, es posible que desee limitarlo a la
findPortfunción (y a cualquier otra función en la que se base si existe)También puedes hacer:
Para incrustar el código de la
findPortfunción en una función anónima a la que pasa el argumento 3306. O incluso:(el script en línea pasado a
-ces el cuerpo de la función).Puede usar una función auxiliar como:
No utilice:
Como los argumentos de
sdosufrirían otro nivel de análisis de shell. Comparar:fuente
sudo. Pude adaptar su solución de función anónima para hacer precisamente eso. He agregado la siguiente función a mi~/.zshrc, que es una función para ejecutar otras funciones con privilegios elevados:sdo() { sudo zsh -c "(){$functions[$1]} ${@:2}" }Una solución muy simple para mí fue invocar un shell interactivo usando
sudo -s, que parece funcionar en mi versión de zsh (5.2) incluida en macOS. Esto me proporciona las funciones de mi~/.zshrc.Desde la página de manual de sudo, que realmente no sugiere este comportamiento:
No estoy seguro de cuál es su caso de uso, pero sospecho que está buscando una solución interactiva.
fuente
myFunc, escribiendosudo myFunc, de la misma manera que elevaría cualquier proceso (comosudo rm -rf .). Esta solución eleva mi solicitud completa y todas las funciones futuras, además de cambiar mi usuario para todas las funciones futuras, lo cual es un poco exagerado.sudo -scomando lanzará otra instancia de su shell como superusuario. Si ejecuta ese comando de forma interactiva, su nuevo shell será interactivo. Pero el comandosudo -s findPort 3306ejecutará el comandofindPort 3306en su shell como superusuario y luego saldrá con el código de estado de ese comando.Pude producir una taquigrafía reutilizable para una de las soluciones descritas en la respuesta de Stéphane Chazelas . [Editar: Stéphane ha iterado en el atajo original que propuse; el código descrito aquí es una versión más nueva de su creación]
Pon esto en tu
~/.zshrc:Ahora puede usarlo
sdocomo "solosudopara funciones definidas por el usuario".Para confirmar que
sdofunciona: puede probarlo en una función definida por el usuario que imprima su nombre de usuario.fuente
Esto parece funcionar para mí:
fuente