Historial de comandos en bash

comando history

Intérprete de comandos

Bash es el intérprete de comandos (también conocido como shell) que suele venir por defecto en las distribuciones de Linux. Este intérprete nos permite realizar tareas complejas de manera relativamente simple, pues solo hemos de escribir los comandos adecuados (la parte difícil es conocer y entender esos comandos 😂).

El funcionamiento es muy sencillo:

  1. El interprete nos muestra un prompt, que es un indicativo con el que nos avisa que está esperando nuestras órdenes.
  2. Escribimos el comando que queramos ejecutar, incluidos sus parámetros.
  3. Pulsamos ENTER y el sistema ejecutará la acción solicitada.
  4. Podremos ver que nos muestra por pantalla el resultado de la ejecución (si esta tiene una salida visual).
  5. Y, tras acabar la ejecución,  volveremos al punto 1, listos para la siguiente tarea.

En este artículo nos vamos a centrar en ver como funciona su historial de comandos.

Repetir comandos

Casi sin duda alguna, parte de nuestra rutina consistirá en repetir comandos que ya hemos realizado con anterioridad. Pero el tener que recordar exactamente los comandos y todos sus parámetros y también el tener que volver a teclearlos puede resultar bastante fastidioso.

Por ello, los intérpretes de comandos suelen incorporar algún mecanismo para facilitarnos su repetición.

Historial de comandos

El historial es la memoria que tiene nuestro sistema para recordarnos todos esos comandos que hemos ido ejecutando.

Lo que le da la potencia al historial de bash son estas 2 características:

  • Tamaño: Por defecto, es capaz de recordar los últimos 1000 comandos ejecutados. Cantidad que, en general, resultará más que suficiente. De todas formas, si te parece poco (o mucho) se puede cambiar el tamaño mediante la variable HISTSIZE.
  • Persistente: Esto significa que el historial se mantiene entre apagados y encendidos, lo que nos permite recordar qué hicimos «ayer» y aprovecharlo. Para ello, el historial se almacena en el fichero .bash_history dentro de nuestro directorio de usuario.

Flecha arriba, flecha abajo

Seguro que muchos (los que usemos algún tipo de shell) nos hemos pasado una buena parte de nuestro tiempo pulsando flecha arriba y flecha abajo viendo como pasan, una a una, por nuestra línea de comandos las tareas que hemos ido realizando en busca de la que queremos repetir.

Esta opción, además de la más conocida, resulta muy cómoda para buscar 1, 2, 3, 4 o 5 comandos atrás en el tiempo. Mas allá se vuelve pesado el tener que seguir pulsando tecla arriba a la espera de encontrar nuestro objetivo, y más si hemos de buscar sobre, como hemos comentado, 1000 opciones.

Comando history

Para esto, viene en nuestra ayuda el comando history. Este comando nos muestra por el terminal un listado con todos los comandos almacenados en el historial. Así que lo ejecutamos y veremos el resultado:

comando history

En la imagen podemos ver la lista de comandos ejecutados, los cuales van precedidos por un número que nos servirá para identificarlos.

En este caso, he partido de un historial limpio (se puede borrar con history -c) y solo hay 8 resultados, pero ya hemos dicho que podría haber hasta 1000, por lo que pasarían «a toda prisa» por nuestra pantalla y realmente solo podríamos ver los últimos.

Filtrado

Para evitar lo comentado, un primer punto de filtrado sería el comando more.

history | more

De esta forma, podríamos ver cómodamente página por página todos los comandos sin perder de vista ninguno. Pero igualmente puede resultar en una gran multitud de páginas y llevarnos su tiempo acabar encontrando algo.

 

Podemos realizar un filtrado más adecuado con grep. Este filtro nos devuelve solo las líneas que contengan el texto buscado, por lo que nos permitirá una búsqueda mejor enfocada.

history | grep texto_a_buscar

 

history filtrado con grep

Aquí solo veremos los resultados que coincidan con lo que estamos buscando, por lo que será mucho más rápido y directo.

Voy a remarcar que lo que grep filtra es texto, no comandos. Y con este texto podemos hacer referencia a cualquier parte del texto que tenga la línea que queramos buscar:

  • El nombre del comando o parte del mismo.
  • Algún parámetro o parte de los mismos. Como ejemplo podría ser el nombre de un fichero y así veríamos las acciones que hemos ejecutado sobre el mismo.

En la imagen anterior se muestran 3 formas distintas para encontrar el mismo comando, según lo que acabamos de comentar. grep nos ayuda coloreando de rojo la parte del texto buscado dentro de la línea completa.

Ejecutar comandos del historial

Bueno, ya sabemos como ver los comandos que hemos realizado en el pasado. Pero lo que de verdad nos interesa es volver a ejecutarlos de la forma más sencilla posible. Así que veamos ahora  como hacerlo (spoiler: !).

Flecha arriba, flecha abajo:

Este método ya lo hemos comentado. Simplemente nos vamos moviendo por la lista hasta encontrar el comando buscado.

Ejecutar el último comando:

!!

Esto repetirá el último comando ejecutado.

Ejecutar comandos previos:

!-x

En este caso, tras la admiración escribiremos un número negativo (-x) que corresponderá, hacia atrás, con el orden de ejecución.  Por ejemplo, !-1 será equivalente a !!, ejecutando el último comando, y !-2 ejecutará el penúltimo.

Ejecutar el comando por número en la lista:

!x

Antes hemos comentado que en el comando history, junto al comando aparece un número para identificarlo. Entonces, en este caso colocaremos ese número (x, en este caso positivo) para que se ejecute el comando deseado.

Ejecutar el comando por el nombre:

!texto

Con este formato, en texto pondremos el comando que queremos repetir. Pero hay que tener en cuenta:

    • En texto habrá que poner el nombre del comando o parte del mismo (pero es obligatorio que incluya el comienzo), sin incluir los parámetros. Ojo, que lo puesto en texto puede acabar coincidiendo con otros comandos cuyo nombre empiece igual. p.e. con ls podría ser ls, lsmod, lsusb, lspci
    • Se repetirá el último comando ejecutado que coincida con la búsqueda. Esto es importante, pues si hemos ejecutado varias veces el mismo comando pero con distintos parámetros, tendremos que estar seguros que el último ha sido el de los parámetros que queremos.

 

 

Veamos algunos ejemplos. en ellos se aprecia que, antes de repetir el comando, nos muestra por pantalla el comando exacto que se va a ejecutar (incluyendo los parámetros).

repeticion de comandos

 

Ante la duda, podemos incluir :p al final, en cualquiera de las variantes,  y de esta forma se mostrará por pantalla el comando entero, sin llegar a ejecutarse, para que podamos asegurarnos de que es lo que queremos.

consulta comando a repetir

 

 

 

 

 

Bueno, para terminar indicaros que el historial de bash todavía dispone de más posibilidades para la optimización del uso del terminal. Os animo a descubrirlas por vuestra cuenta si os ha resultado interesante.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

cinco × tres =

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.