# rm-rf.es

No guardar en el history de bash la ejecución de comandos (HISTCONTROL)

La variable de entorno HISTCONTROL nos permite jugar con el comportamiento que tendrá nuestra shell Bash a la hora de almacenar el histórico de comandos ejecutados. Lo primero que podemos ver es la información que nos ofrece la página man de bash:

HISTCONTROL

A colon-separated list of values controlling how commands are saved on the history
list. If the list of values includes ignorespace, lines which begin with a space
character are not saved in the history list. A value of ignoredups causes lines
matching the previous history entry to not be saved. A value of ignoreboth is short-
hand for ignorespace and ignoredups. A value of erasedups causes all previous lines
matching the current line to be removed from the history list before that line is
saved. Any value not in the above list is ignored. If HISTCONTROL is unset, or does
not include a valid value, all lines read by the shell parser are saved on the his-
tory list, subject to the value of HISTIGNORE. The second and subsequent lines of a
multi-line compound command are not tested, and are added to the history regardless
of the value of HISTCONTROL.

Si investigáis esta página veréis información muy interesante respecto a otras variables de history y su comportamiento. En el caso de HISTCONTROL vemos que indica que los valores separados por «:» controlar como los comandos se guardan en la lista del history.

Sin entran en si es buena práctica o mala, vemos que podemos forzar a que la ejecución de un comando no se almacene en el history, para ello añadiremos un espacio al comienzo de la línea, siempre y cuando la variable de entorno tenga especificado el valor ignorespace o ignoreboth:

# export HISTCONTROL="ignorespace:ignoredups"

Hemos especificado que en el history no se guarden las líneas de ejecución que comiencen por un espacio ni las duplicadas:

#  echo "test con espacio" # fijaos en el espacio del comienzo
test con espacio
# history
    1  export HISTCONTROL="ignorespace:ignoredups"
    2  history

Efectivamente el echo no se ha guardado en el history, si ejecutáramos un comando varias veces sin variar la línea sólo se guardaría una vez:

# echo "Prueba"
Prueba
# echo "Prueba"
Prueba
# echo "Prueba"
Prueba
# history
    1  export HISTCONTROL="ignorespace:ignoredups"
    2  history
    3  echo "Prueba"
    4  history

Si queremos hacerlo permanente, guardamos la variable de entorno en nuestro perfil de bash. Si la vaciamos veremos que ya no funciona lo anteriormente probado:

# export HISTCONTROL=""

ó

# unset HISTCONTROL
#  echo "Prueba 2"
Prueba 2
# history
...
...
    5  export HISTCONTROL=""
    6   echo "Prueba 2"
    7  history

Como os comentaba, os recomiendo revisar la página man para ver otras personalizaciones interesantes del funcionamiento de history en bash. Por ejemplo, también podemos deshabilitar temporalmente el history en nuestra sesión limpiando la variable HISTFILE:

# unset HISTFILE

En definitiva, lectura recomendada:

$ man bash
Salir de la versión móvil