¿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? ``

Manishearth
fuente
Ver también Ejecutar una línea de comandos con un sudo
Gilles 'SO- deja de ser malvado'
Posible lo mismo en SU: superuser.com/questions/240180/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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 !!)"'
rici
fuente
¿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.

jpschorr
fuente
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
5

Ahora hay un repositorio para este propósito en GitHub, comprueba mágicamente si necesita derechos de superusuario, también corrige los errores tipográficos:

https://github.com/nvbn/thefuck

Arda
fuente
Intenté apt-get install thefuckcuál existe, pero no funciona en mi Ubuntu 15.10; (
rubo77
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>.

Pandya
fuente
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
-1
alias please="sudo $(history -p \!\-2)"
Antonin GAVREL
fuente