En cumplimiento del Real Decreto-ley 13/2012 le informamos que este blog utiliza cookies propias y de terceros con el objetivo de personalizar el contenido, ofrecer funciones de redes sociales y analizar el tráfico. Si continúa navegando consideramos que acepta el uso de cookies. A partir del resultado de la votación en el parlamento europeo de la reforma de la protección de datos este mensaje puede desaparecer en abril y pasar a mostrarse una vez al mes como recordatorio.
Acepto | Quiero saber más
TuxyLinux

El historial de comandos de bash

Cuándo trabajamos con el terminal todos sabemos que usando las flechas de arriba y abajo del teclado podemos ver los comandos que hemos escrito en el terminal y volver a ejecutarlos sin tener que escribir toda la linea de nuevo.

Esto es posible gracias al historial de bash que almacena los comandos que vamos escribiendo y los guarda de una sesión a otra mediante el archivo ~/.bash_history. En este archivo se almacenan los comandos que hemos usado cada vez que cerramos una sesión de terminal.

Uso del hitorial de bash

Para consultar este historial escribimos history en el terminal.

[usuario@equipo ~]$ history

Por supuesto podemos usar filtros como head, tail, less o grep para consultar mejor la salida.

[usuario@equipo ~]$ history |head -9
1 cd
2 mkdir uno
3 touch uno/archivo
4 clear
5 chmod og-rwx -R uno
6 ls -lh uno
8 rm -rf uno/
9 history

Si en algún momento queremos vaciar el historial usamos la opción -c

[usuario@equipo ~]$ history -c
[usuario@equipo ~]$ history
history

El comando anterior borrará el historial de la sesión actual pero no se guardará en el .bash_history y puede ser consultado por aquellos usuarios que tengan acceso a él mientras no cerremos el terminal (o la sesión en ese terminal) .

Esto es así por el funcionamiento del historial. Al abrir un terminal se carga .bash_history y conforme escribimos comandos se van almacenando temporalmente en memoria, al cerrar el terminal el archivo .bash_history se sobrescribe con el historial almacenado en la memoria.

Por esta razón cuando trabajamos con varios terminales a la vez sólo se guarda el historial del último terminal que cerramos.

Si queremos guardar el historial en el .bash_history sin cerrar el terminal se usa la opción -w

[usuario@equipo ~]$ history -w

Por tanto, para no dejar rastro del historial tenemos que usar la opción -c y -w.

[usuario@equipo ~]$ history -c
[usuario@equipo ~]$ history -w

o bien borrar el archivo ~/.bash_history

[usuario@equipo ~]$ history -c
[usuario@equipo ~]$ rm ~/.bash_history

Variables de entorno del historial

Por defecto el historial de bash guarda los 500 últimos comandos usados, si superamos este valor se irán borrando los comandos almacenados al principio para dejar sitio a los actuales. Podemos cambiar este valor y otras opciones interesantes con las variables de entorno.

Estas son algunas variables de entorno que podemos modificar:

HISTCONTROL

Esta variable controla los comandos que se guardan en el historial según la opción que tengamos configurada.

igonorespace -> No guarda los comandos precedidos por un espacio.Si tenemos esta opción habilitada y escribimos lo siguiente:

[usuario@equipo ~]$ clear
[usuario@equipo ~]$ echo "sin espacio"
[usuario@equipo ~]$ echo "con espacio"

y después comprobamos el historial.

[usuario@equipo ~]$ history |tail -3
616 clear
617 echo "sin espacio"
618 history |tail -3

Vemos como el comando que escribimos poniendo primero un espacio no se ha guardado en el historial.

ignoredups -> Si repetimos el mismo comando varias veces seguidas sólo se almacenará una vez. Ejemplo:

[usuario@equipo ~]$ clear
[usuario@equipo ~]$ echo "di algo"
[usuario@equipo ~]$ echo "di algo"
[usuario@equipo ~]$ echo "di algo"
[usuario@equipo ~]$ echo "no digo nada"
[usuario@equipo ~]$ echo "di algo"

Comprobamos el historial.

[usuario@equipo ~]$ history |tail -3
620 echo "di algo"
621 echo "no digo nada"
622 echo "di algo"

ignoreboth -> Esta opción combina las dos anteriores (ignorespace e ignoredups). Es lo mismo que escribir HISTCONTROL="ignoredups:ignorespace".

erasedups -> Esta opción es similar a ignoredups solo que elimina los comandos repetidos de forma que queda el más reciente en el historial. Veamoslo con un ejemplo.

[usuario@equipo ~]$ clear
[usuario@equipo ~]$ echo "di algo"
[usuario@equipo ~]$ echo "di algo"
[usuario@equipo ~]$ echo "di algo"
[usuario@equipo ~]$ echo "no digo nada"
[usuario@equipo ~]$ echo "di algo"

Al listar el historial comprobamos que efectivamente los comandos repetidos sólo quedan almacenados una vez en todo el historial.

[usuario@equipo ~]$ history |tail -3
623 clear
624 echo "no digo nada"
625 echo "di algo"

HISTSIZE

Establece la cantidad de comandos que se almacenan en el historial de la sesión actual. Por defecto son 500.

HISTFILE

Indica el archivo dónde se guarda el historial. Por defecto se guarda en ~/.bash_history.

HISTFILESIZE

Es la cantidad de comandos que se almacenan en el archivo del historial. Por defecto son 500.

HISTTIMEFORMAT

Formato de la fecha. Nos permite que el historial muestre la fecha en la que se ejecutó un comando siguiendo los mismos patrones que el comando date. Ejemplo:

[usuario@equipo ~]$ HISTTIMEFORMAT="%H:%M:%S > "
[usuario@equipo ~]$ clear
[usuario@equipo ~]$ echo
[usuario@equipo ~]$ history |tail -3
626 14:13:20 > HISTTIMEFORMAT="%H:%M:%S > "
627 14:13:20 > clear
628 14:13:20 > echo

HISTIGNORE

En esta variable se indica una lista de comandos que no queremos que se almacenen en el historial, deben ir separados por dos puntos. Ejemplo

[usuario@equipo ~]$ HISTIGNORE="clear:pwd:ls"
[usuario@equipo ~]$ cd ..
[usuario@equipo ~]$ clear
[usuario@equipo home]$ cd usuario
[usuario@equipo ~]$ pwd
/home/usuario

Verificamos que no se guardaron los comandos en el historial.

[usuario@equipo ~]$ history |tail -3
628 echo
629 cd ..
630 cd usuario

Modificar las variables

Las variables de entorno podemos modificarlas para que tengan efecto en la sesión actual o para que afecten a todas las sesiones de terminal que iniciemos.

Modificarlas temporalmente

Para modificarlas temporalmente hay que escribir la variable y asignarle el valor que queramos. En este ejemplo cambio el tamaño del historial y el formato de fecha.

[usuario@equipo ~]$ HISTSIZE=1200 && HISTFILESIZE=2000
[usuario@equipo ~]$ HISTTIMEFORMAT="%H:%M:%S > "

Hay algunas variables que no se pueden modificar para la sesión como es el caso de HISTFILE, estas variables se deben modificar permanentemente.

Modificarlas permanente

Para modificar las variables permanentemente se hace dando el valor que queramos a las variables en el archivo ~/.bashrc y luego se exportan. Esa configuración que el demos será válida para ese usuario, el resto de usuarios no se verán afectados por el cambio y mantendrán su configuración del historial.

Por ejemplo, en el siguiente archivo /root/.bashrc se configura el historial del usuario root para que ignore los comandos que empiezan con espacio, se establece el tamaño del historial a 2500 comandos, se ignoran los comandos clear, su, pwd y history y se le da un formato de fecha al historial.

HISTCONTROL=ignoreboth
HISTSIZE=2500
HISTFILESIZE=$HISTSIZE
HISTIGNORE="clear:su:pwd:history"
HISTTIMEFORMAT="%d/%h/%Y - %H:%M:%S > "export HISTCONTROL HISTSIZE HISTFILESIZE HISTIGNORE HISTTIMEFORMAT

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.

Deja un comentario

Tu dirección de correo electrónico no será publicada.