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 «;».