Después de haber visto las variables de entorno del historial vamos a ver un par de trucos para manejar mejor el historial de bash y evitar repetir un mismo comando varias veces.

Eventos del historial

Los eventos del historial nos permiten ejecutar comandos que se hayamos usado con anterioridad. El más conocido es pulsar la flecha arriba del teclado para ver el comando ejecutado anteriormente.

Ejecutar un comando a partir del número del historial

Se puede ejecutar un comando a partir de su número en el historial, para hacerlo se utiliza el carácter de exclamación ! seguido del un número o una cadena.

Supongamos que tenemos el siguiente historial guardado.

[usuario@equipo ~]$ history
1 cd Documentos
2 cd scripts
3 ls -1
4 rm "script.sh"
5 vim script.sh
6 chmod u+x script.sh
7 sh script.sh
8 pwd
9 history

Podemos ejecutar cualquiera de esos comandos mediante el número que tienen asignado en el historial. Por ejemplo, si quiero ejecutar el comando con id 4 (comando ls -1).

[usuario@equipo ~]$ !4
ls -1
Descargas
Documentos
Escritorio
Imágenes
Música
Plantillas
Público
Vídeos

También se puede indicar un comando que se escribiera una determinada cantidad de comandos atrás antes de la linea actual. El mismo comando anterior se podría ejecutar también de la siguiente manera.

[usuario@equipo ~]$ !-7
ls -1
Descargas
Documentos
Escritorio
Imágenes
Música
Plantillas
Público
Vídeos

y el comando pwd con !-2.

[usuario@equipo ~]$ !-2
pwd
/home/usuario

Además de la flecha arriba podemos ejecutar directamente el último comando introducido con !-1 como ya he dicho o con !!

[usuario@equipo ~]$ !!
history
1 cd Documentos
2 cd scripts
3 ls -1
4 rm "script.sh"
5 vim script.sh
6 chmod u+x script.sh
7 sh script.sh
8 pwd
9 history

Ejecutar un comando a partir de una cadena

Otra forma de ejecutar comandos del historial es poniendo el comando después del símbolo de exclamación. Esto ejecutará el último comando coincidente con nuestra cadena. Por ejemplo, si ponemos !cd lo que hará será ejecutar el comando 2 del historial porque es el más reciente.

[usuario@equipo ~]$ !cd
cd scripts
bash: cd: scripts: No existe el fichero o el directorio

También es posible ejecutar un comando que tenga un determinado argumento o una cadena en concreto con !?.

[usuario@equipo ~]$ !?"
rm "script.sh"
rm: no se puede borrar «cuo»: No existe el fichero o el directorio

La instrucción anterior buscó y ejecutó el comando más reciente que tuviera una comilla doble en alguna parte de la linea, en nuestro caso fue rm "script.sh". Si hacemos lo mismo con un trozo de palabra hará lo mismo.

[usuario@equipo ~]$ !?mentos
cd Documentos

En nuestro historial la única palabra que contiene parte de la cadena "mentos" es cd Documentos, así que lo ejecuta.

Ejecutar un comando anterior reemplazándolo

Otro truco muy interesante que uso bastante cuando escribo scripts es reemplazar el comando anterior (o el que coincida) por otro diferente manteniendo los mismos argumentos.

[usuario@equipo ~]$ ^vim^cat
cat: script.sh: No existe el fichero o el directorio

La instrucción anterior busca el comando vim más reciente y lo sustituye con cat, en nuestro historial cogería la linea 5 (vim script) y lo sustituye con cat scripts.