Optimizar el uso del Bash History

En este post vamos a ver una serie de trucos para mejorar y optimizar el uso del histórico de comandos de bash (Bash History) mediante la configuración de variables de entorno.

Añadir fecha y hora al Bash History

Saber la fecha y hora en la que se ha ejecutado un comando en Bash puede ser tan importante como saber qué comando es el que se ha ejecutado. Por defecto, el HISTORY de Bash no muestra este dato. Para añadirlo debemos configurar la variable de entorno HISTTIMEFORMAT especificando el formato de fecha y hora que queremos especificar en el log del histórico de comandos:

$ export HISTTIMEFORMAT="%h/%d - %H:%M:%S "

A partir de ese momento, sin necesidad de recargar la sesión de bash aparecerá en el history la fecha y hora de cada comando con el formato especificado:

$ history | tail -5
 2004  Oct/26 - 08:24:49 env
 2005  Oct/26 - 08:24:52 env | grep HIST
 2006  Oct/26 - 08:25:28 ls -l
 2007  Oct/26 - 08:25:30 history
 2008  Oct/26 - 08:26:16 history | tail -5

Para que el cambio sea persistente añadimos el export de la variable a nuestro .bashrc:

~/.bashrc

Número de comandos a guardar y tamaño del History

Por defecto, si no recuerdo mal se guardan un máximo de 500 comandos en el histórico de Bash. Para aumentar este valor debemos configurar la variable HISTSIZE especificando el nº de comandos a almacenar:

$ export HISTSIZE=10000

El número máximo de líneas a guardar en el archivo se especifica con HISTFILESIZE:

$ export HISTFILESIZE=10000

El nombre del archivo que almacena el histórico puede ser modificado con la variable “HISTFILE”:

$ export HISTFILE=~/.history_file

Deshabilitar History

Al igual que HISTSIZE sirve para aumentar el tamaño del history, si le configuramos como valor “0” lo deshabilita por completo:

$ export HISTSIZE=0

Uso de HISTCONTROL: ignorar comandos duplicados, evitar guardar ciertos comandos

Para la variable HISTCONTROL hice una entrada específica hace unos años: No guardar en el history de bash la ejecución de comandos (HISTCONTROL). En esa entrada veíamos algún truco como podía ser especificar que no se almacenaran comandos duplicados en el history:

$ export HISTCONTROL="ignoredups"

Y otro truco, un poquito más malvado, que consiste en evitar guardar registro de la ejecución de ciertos comandos, para ello especificamos que aquellos comandos que comiencen con un “espacio” no sean almacenados en el HISTORY:

$export HISTCONTROL="ignorespace"

Podríamos combinar ambas configuraciones separandolas con “:”:

$ export HISTCONTROL="ignorespace:ignoredups"

Con “ignorespace”, el siguiente comando no quedaría guardado en el history:

 $ history | tail -5
 2009  Oct/26 - 08:26:45 cat .bashrc 
 2010  Oct/26 - 08:31:13 man bash
 2011  Oct/26 - 08:37:59 history | tail -5
 2012  Oct/26 - 08:38:09 export HISTCONTROL="ignorespace:ignoredups"
 2013  Oct/26 - 08:38:14 history | tail -5
$  echo "este comando no se guarda en el HISTORY"
este comando no se guarda en el HISTORY
$ history | tail -5
 2009  Oct/26 - 08:26:45 cat .bashrc 
 2010  Oct/26 - 08:31:13 man bash
 2011  Oct/26 - 08:37:59 history | tail -5
 2012  Oct/26 - 08:38:09 export HISTCONTROL="ignorespace:ignoredups"
 2013  Oct/26 - 08:38:14 history | tail -5

Hay que tener cuenta que ignoredups sólo ignora los comandos duplicados consecutivos. Para que se tenga en cuenta evitar duplicados a lo largo de todo el history se utiliza erasedups:

$ export HISTCONTROL="ignorespace:ignoredups:erasedups"

Ignorar ciertos patrones o comandos

Con la variable HISTIGNORE podemos especificar, separados por “:”, una lista de patrones o comandos que no serán almacenados en el History de bash. Podemos por ejemplo evitar que se muestre la ejecución del propio comando “history”:

$ export HISTIGNORE="history"

De este modo “history” no aparecerá, pero sí “history | less” y similares así que usamos un wildcard para evitarlo:

$ export HISTIGNORE="history*"

Podemos añadir más comandos a ignorar, siempre separados por “:”:

$ export HISTIGNORE="history*:echo*:ps*"

Utilizar History entre múltiples sesiones activas de bash

Con la configuración por defecto de history, usar varias sesiones de forma simultanea supone un problema. Por un lado, el histórico de comandos se guarda cuando finalizamos la sesión, es decir, al hacer un “exit” en bash. Por defecto, al guardar el histórico de sesión, los contenidos del archivo se sobreescriben así que es posible que los comandos ejecutados en una de las sesiones no queden almacenados en el histórico.

Para solucionar este problema, podemos decir que añada los comandos en el archivo history en lugar de sobreescribirlos:

$ shopt -s histappend

Además, también podemos especificar que los comandos se almacenen en el archivo de history al momento de ser ejecutados en lugar de al finalizar la sesión. De este modo, sesiones simultaneas podrán visualizar en el histórico sus respectivas ejecuciones de comandos:

$ PROMPT_COMMAND='history -a'

Al igual que en el resto de casos, añadimos las variables y comandos a nuestro .bashrc:

~/.bashrc

Verificad antes que la variable de entorno PROMPT_COMMAND no tiene ningún valor asignado, así no lo perderemos al establecer esta configuración. En caso de que lo tenga, podemos concatenar ambos valores separados por “;”.

3 comentarios en “Optimizar el uso del Bash History

  1. Hola,

    Pues me acabo de fijar que si ajustas el history todas las fechas se ponen a la fecha/hora en que se ha iniciado sesión y a partir de ahí se empieza a contar. Ha sido curioso.

    Saludo

Deja un comentario

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