¿Qué hace "apt-get install !!" y cómo hacer que funcione?

54

He visto a alguien escribiendo

apt-get install !!

Lo hizo algunas veces y cada vez, se instaló un programa diferente. Parece que automáticamente descubrió lo que se necesita a continuación.

Sin embargo, cuando lo probé en mi máquina virtual Ubuntu 14.04.1 LTS, solo mostró algunas instrucciones de uso. Buscar en Google apt-get install !!no parece funcionar muy bien. Muchos resultados de búsqueda no contienen el doble signo de exclamación.

¿Qué hace apt-get install !!y qué podría faltar en mi máquina que no funcionó?

Thomas Weller
fuente
1
Ver también: stackoverflow.com/q/15137461/3488231
ace_HongKongIndependence

Respuestas:

74

!! es un acceso directo en bash que significa el último comando ejecutado.

Prueba esto:

 echo hello
 !!

En este contexto, !!se ampliará a otro echo hello.

Me imagino que lo que sucedió fue que intentaron ejecutar un comando y falló y se quejó de que no estaba instalado. Entonces escribieron sudo apt-get install !!porque el nombre del paquete era casualmente el mismo que el nombre del comando que intentaron ejecutar. El comando resultante intentaría instalar un paquete con el mismo nombre que el comando que acababan de intentar ejecutar.

Stephen
fuente
10
Sí, eso es probablemente todo. Si ejecuto lynx, verifique que no esté instalado y luego ejecutarlo apt-get install !!instala lynx. No funcionó para mí, porque lo intenté apt-get install !!como el único comando.
Thomas Weller
44
Otro uso común es cuando algo debería haberse ejecutado como sudo, por ejemplo apt-get install, algo.
MBraedley
66
@AL: primero escribe apt-get install some-program, y cuando se da cuenta de que no tiene privilegios, simplemente sudo !!, que se expande sudo apt-get install some-program.
mgarciaisaia
3
!!es un alias para !-1, lo que significa el último elemento en el historial de bash. !-2es el penúltimo y así sucesivamente.
Tim
41

!!no tiene nada que ver con apt-get. Es una palabra clave de shell que se expandirá al comando anterior. Shell realiza esta expansión antes de interpretar el comando actual.

De man bash:

!! Consulte el comando anterior. Este es un sinónimo de `! -1 '.

Por ejemplo, si ejecuta un comando:

echo "foo"

Entonces si corres:

sudo apt-get install !!

se ampliará a:

sudo apt-get install echo foo

Como puede ver, se expande en dos paquetes, a saber, echoy el otro es foo. No hay un paquete independiente llamado fooy echo. Además del shell integrado, echohay un /bin/echoejecutable que forma parte del paquete GNU-coreutils. Por lo tanto, recibirá errores que indican que no hay paquetes disponibles.

Por otro lado, la otra persona podría estar haciendo algo como esto:

$ cowsay
The program 'cowsay' is currently not installed. You can install it by typing:
sudo apt-get install cowsay

$ sudo apt-get install !!
sudo apt-get install cowsay
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  filters
The following NEW packages will be installed:
  cowsay
0 upgraded, 1 newly installed, 0 to remove and 119 not upgraded.
Need to get 18.5 kB of archives.

Como puede ver cowsayse está instalando.

Te sugiero que no hagas esto (a menos que estés seguro), ser explícito no hace daño.

heemayl
fuente
2
Gran explicación para el !!. Sabía lo que significaba, pero me gusta cómo lo describiste.
Terrance
1
+1 para la advertencia de no intentar esto en casa.
Shadur
16

!!: Consulte el comando anterior. Este es un sinónimo de !-1(La fuente ).

Por ejemplo, si ejecuto:

./test

entonces recuerda que necesito ser Root, entonces simplemente podría escribir:

sudo !!

es lo mismo que escribir:

sudo ./test

Es útil cuando su último comando contiene muchos caracteres.

Bilal
fuente
1
¡Brillante! Nunca pensé en el sudo !!comando; Lo que he estado haciendo durante años es presionar la tecla hacia arriba una vez, luego mover el cursor hacia la izquierda y agregar sudo.
IQAndreas
1
@IQAndreas Your way te da la oportunidad de verificar dos veces el comando, lo que no es malo cuando se ejecuta sudo.
Matt Nordhoff
1
Siempre leo "sudo !!" como "me refería a sudo por el amor de Dios"
Viktor Mellgren
1
@Vixen: En ese caso, el polvo también podría ser algo para ti
Thomas Weller
@IQAndreas mover el cursor hacia la izquierda parece demasiado aburrido. ¿Por qué no solo Ctrl+Ao al menos Home?
Ruslan
2

La pregunta ya ha sido respondida, así que no seré repetitivo. Sin embargo, me gustaría señalar que existen numerosos accesos directos en varios shells que ayudan a repetir / buscar / editar comandos. Algunos de los que uso son:

  1. !$seguido de ENTERescribirá la última palabra del último comando. Por ejemplo,

    ls -l /let/me/in
    cd !$

Esto te llevará a /let/me/in

  1. Ctrl- Ry luego escriba algunas palabras de un comando anterior. Por ejemplo, si ha escrito vi /home/mycoolproject.shy lo siguió con algunos comandos al azar, como ls, cd, pwd, etc, entonces simplemente escribiendo Ctrl- Rseguido por coolse tire hacia arriba que vimando.

¡Solo busca atajos de teclado bash (o csh o lo que sea) y será lo mejor que hiciste hoy!

Saltando conejito
fuente