Este artículo fue publicado originalmente en go2linux.org el 4 de enero de 2009. El dominio ya no me pertenece, pero soy el autor original. Lo republico aquí en garron.me con correcciones y mejoras.

Introducción

El comando history de Bash lista tus comandos recientes. Una vez que encuentras el que necesitas, no hay razón para volver a escribirlo — Bash ofrece varias formas rápidas de recuperarlo y ejecutarlo.

Para saber cómo funciona el propio comando history (listado, búsqueda y configuración del tamaño del historial), consulta history — el comando de Linux para gestionar el historial de comandos.

Volver a ejecutar un comando por número — !N

Escribe ! seguido inmediatamente del número de comando que aparece en la salida de history (sin espacio):

history
  466  man nohup
  467  sudo apt install vim
  468  sudo vim /etc/apt/sources.list
  469  sudo apt update
  470  man nice

Para volver a ejecutar el comando 470:

!470

Esto ejecuta man nice de inmediato. No hay confirmación.

Volver a ejecutar el último comando — !!

!! se expande al comando anterior completo:

apt update
# bash: permiso denegado

sudo !!
# Ejecuta: sudo apt update

Esto es especialmente útil cuando olvidas poner sudo.

Volver a ejecutar el último comando que empieza por una cadena — !cadena

!cadena busca hacia atrás en el historial el comando más reciente que empiece por cadena:

!vim          # vuelve a ejecutar el último comando que empezó con "vim"
!sudo apt     # vuelve a ejecutar el último comando que empezó con "sudo apt"

Usar parte del último comando — !$, !^, !*

Estos designadores de evento permiten reutilizar partes del último comando.

Atajo Se expande a
!$ Último argumento del comando anterior
!^ Primer argumento del comando anterior
!* Todos los argumentos del comando anterior

Ejemplo — !$:

mkdir /var/www/miaplicacion
cd !$        # cd /var/www/miaplicacion

Ejemplo — !^:

diff archivo1.txt archivo2.txt
vim !^       # vim archivo1.txt

Sustitución rápida — ^viejo^nuevo

Reemplaza una palabra en el comando anterior y ejecuta la versión corregida:

cat /etc/ngnix/nginx.conf
# error tipográfico en la ruta

^ngnix^nginx
# Ejecuta: cat /etc/nginx/nginx.conf

Búsqueda inversa — Ctrl+R

Pulsa Ctrl+R y empieza a escribir. Bash busca hacia atrás en el historial y muestra la coincidencia más reciente mientras escribes.

(reverse-i-search)`vim': sudo vim /etc/nginx/nginx.conf
  • Pulsa Ctrl+R otra vez para ir a la coincidencia anterior
  • Pulsa Enter para ejecutar el comando mostrado
  • Pulsa Ctrl+G o Escape para cancelar sin ejecutar nada

Ctrl+R suele ser la forma más rápida de volver a ejecutar un comando reciente del que no recuerdas el número.

Vista previa sin ejecutar — :p

Para ver a qué se expandiría !N o !cadena sin ejecutarlo, añade :p:

!470:p        # muestra el comando pero no lo ejecuta
!vim:p        # muestra el comando coincidente pero no lo ejecuta

El comando también se añade al historial, así que puedes pulsar la tecla de cursor arriba para editarlo antes de ejecutarlo.

Tabla resumen

Atajo Qué hace
!N Vuelve a ejecutar el comando número N
!! Vuelve a ejecutar el último comando
!cadena Vuelve a ejecutar el último comando que empieza por cadena
!$ Último argumento del comando anterior
!^ Primer argumento del comando anterior
!* Todos los argumentos del comando anterior
^viejo^nuevo Sustituye viejo por nuevo en el último comando
Ctrl+R Búsqueda inversa interactiva en el historial
!N:p Muestra el comando N sin ejecutarlo

Véase también