¿Cómo puedo `alias sudo !!`?


50

Estoy tratando de establecer un alias sudo !!en Bash. Lo intenté alias sbb='sudo !!', pero lo interpreta como un literal !!e imprime

sudo: !!: command not found

Si uso comillas dobles, sustituye la explosión doble en la cadena en sí, por lo que no funciona.

¿Hay alguna manera de hacer funcionar esto? O un alias alternativo? ``



Respuestas:


61

!!se expande con bash cuando lo escribe. No se expande por sustitución de alias.

Puede usar el historyincorporado para hacer la expansión:

alias sbb='sudo $(history -p !!)'

Si el comando es más que un simple comando (por ejemplo, contiene redirecciones o tuberías), debe invocar un shell bajo sudo:

alias sbb='sudo "$BASH" -c "$(history -p !!)"'

¿Tienes uno para tcsh?
mdpc

1
@mdpc: no uso tcsh, pero miré man tcshy descubrí que sí hace expansión de historial durante la expansión de alias "como si el comando original fuera la línea de entrada anterior". Interesante. Sin embargo, alias sbb 'sudo \!-2no funcionó como se esperaba (en realidad sustituyó la segunda entrada anterior); alias sbb 'sudo \!\!'funcionó como se esperaba (sustituido sbbpor !!); y al final resultó que lo que quería era alias sbb 'sudo \!-1'lo que esperaba que fuera lo mismo \!\!. (tcsh 6.17.06 (Astron) 15/04/2011) YMMV. Buena suerte.
rici

¡Gracias! Este alias es genial cuando, como administrador, olvidas poner sudo delante de tu comando.
mdpc

en lugar de sbbpreferiría el preasealias sugerido por @jpschorr
rubo77

40

Tratar:

alias sbb='sudo $(fc -ln -1)'

Me gusta en realidad prefiero llamarlo 'por favor':

alias please='sudo $(fc -ln -1)'

Información: fces un comando incorporado en el shell bash. que enumera, edita y vuelve a ejecutar comandos ingresados ​​previamente a un shell interactivo.


13
pleasedefinitivamente es el camino a seguir!
Anto

también funciona para bash, por lo que eliminó el comentario 'for zsh'.
Michael Durrant

1
Funciona bien en zsh. fc es el comando a usar. Gracias
Frax

pleasehace que parezca que la terminal es una entidad con la que tengo que ser amable para poder hacer las cosas. Prefiero algo que da una mejor sensación de control, como fuck;)
Przemek D


0

Esto se publicó originalmente en esta pregunta, pero luego se sugirió publicar aquí.

Aquí es cómo puede usar fcy historycon alias para !-sustituciones similares. Supongamos que si desea utilizar !-n(donde n es el dígito para n º último comando utilizado), entonces usted puede utilizar fcy historycon el alias de la siguiente manera:

  1. Utilizando history:

    alias xyz='echo $(history -p "!-<n>") ; sudo $(history -p "!-n")'

    Nota: Aquí !-ndebe encerrarse con 'o ''.

  2. Utilizando fc:

    alias xyz='echo $(fc -ln -n -n) ; sudo $(fc -ln -n -n)'

    Nota: aquí 1 st y 2 nd -n se utilizan para especificar el rango de lista del historial.

Aquí usé eco antes de ejecutar el comando para talar como !-<n>.


Las respuestas anteriores ya cubren history -py fc. ¿Algo nuevo aquí?
muru

Ok, que hay de eso?
Muru

Encuentro el -ln -n -nser intensamente confuso; también el bit sobre 'o ''(y también el bit sobre -<n>).
Scott

La opción 2. debe ser un error tipográfico, creo que quieres$(fc -ln -1)
cmcginty

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.