En la entrada anterior expliqué muy por encima el historial de comandos del terminal así que hoy vamos a profundizar un poco más y ver como se puede modificar el comportamiento 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.

Variables de entorno del historial

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 como ya vimos en la otra entrada.

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