Estoy ejecutando Ubuntu 10.04 y lo uso upstart
para la gestión de demonios. Mi aplicación empresarial se ejecuta como daemon y debe ejecutarse como root debido a varios privilegios. P.ej:
sudo start my-application-long-ID
sudo stop my-application-long-ID
etc
Me gustaría presentar un alias
para abreviar estos comandos como algo así como:
alias startapp='sudo start my-application-long-ID'
y ejecutarlo como startapp
y eso funciona, pero preferiría no tener sudo en el alias.
alias startapp='start my-application-long-ID'
no cuando se ejecuta usando sudo startapp
, volviendo sudo: startapp: command not found
.
Sin embargo, cuando agregué el alias:
alias sudo='sudo '
sudo startapp
ahora funciona pero todavía tengo curiosidad por qué sudo ignora los alias.
source ~/.bashrc
? ¿Esto actualiza el archivo .bashrc y hace que los nuevos alias estén disponibles?Respuestas:
Veo la siguiente información desde aquí .
Cuando use sudo, use la expansión de alias (de lo contrario, sudo ignora sus alias)
La razón por la que no funciona se explica aquí .
fuente
Los alias y las funciones se definen en un shell. Sudo es un programa externo. Por lo tanto, sudo no ve alias, funciones o componentes integrados de shell, solo comandos externos.
Los alias están destinados a ser nombres de comando alternativos, por lo que los shells solo los expanden en la posición del comando, no cuando son argumentos de los comandos. Zsh admite alias globales, que se expanden en cualquier lugar de la línea de comando, y se utilizan con moderación, ya que existe el riesgo de expandirlos accidentalmente, incluso en contextos donde el alias no tiene sentido.
Se puede decir sudo para invocar un shell:
sudo sh -c '…shell command here…'
. Sin embargo, sus alias habituales no estarán disponibles dentro de ese comando de shell, ya que normalmente se almacenan en un archivo como~/.bashrc
o~/.zshrc
que solo se lee mediante shells interactivos.alias sudo='sudo '
, según lo propuesto por Ramesh , hace que el shell expanda los alias despuéssudo
.fuente
alias sudo='sudo '
Funciona también para ZSH?Una solución para usuarios de zsh
Tanto en bash como en zsh, terminar un alias con un espacio hará que el shell expanda alias la siguiente palabra. Esto permite que algo como lo siguiente se expanda alias
myalias
Desafortunadamente, esto se desmorona cuando tiene más de una palabra en su alias (como
sudo -u someone
. Sin embargo, puede abusar de la función zsh "alias globales" para expandir manualmente los alias en cualquier parte del comando.Esto crea un alias global llamado
$
(puede usar cualquier palabra que desee) que termina en un espacio. Esto hace que zsh expanda la siguiente palabra como un alias de comando regular. Dado que el alias se expande al espacio en blanco, no se tratará como un argumento. Esto permite que lo siguiente funcione.Incluso puede usar
$
varias veces en una línea de comando si tiene una anidación de comandos complicada. He encontrado esto lo suficientemente útil como para que tenga un lugar permanente en mi zshrc, sin embargo, el alias es lo suficientemente simple como para definir cuándo necesita usarlo.fuente
Acabo de dar una respuesta alternativa aquí sin redefinir
sudo
con un alias.En tu caso sería:
Todo en una línea, sin shells adicionales, sin redefiniciones de alias. ;-)
fuente
xargs
para quitar las comillas, y grep para quitar las primeras=
. Un poco inteligente, pero probablemente innecesario.eval "sudo $(alias aliasname | cut -d= -f2-)"
es probable que sea mejor:xargs
no siempre manejará las comillas correctamente, y podría haber más de una=
.xargs
no quites las comillas. Es grep quien toma el comando resuelto entre comillas. Ya sabestype -a alias_name
devuelve algo comoalias_name is aliased to command_within_quotes
. Por cierto, he probado su comando y no funcionó en mi ubuntu :-(. ¿Es el regreso detype -a
Diferente entre las versiones de Linux (lo dudo)?.type
hace - enbash
. Sin embargo, entiendes que las citas se duplican, ¿verdad? ¿Lo has probado con un alias que contiene comillas simples? De todos modos, tienes razón acerca de que mi cosa no funciona: necesitas unoeval "sudo sh -c "$(...
oeval "'sudo $(alias alias_name| cut -d\' -f2-)"
. La cuestiónalias
es que, básicamenteeval
, losalias
valores predeterminados son s: la utilidad está especificada para generar su contenido y poder reintroducirlo de forma segura en el shell. Supongo que suxargs
se implementa entonces para aplanar el espacio en blanco? Solo ten cuidado con eso, ¿de acuerdo?