Para comprender el comportamiento del historial de bash primero debe saber lo siguiente:
- Existe el historial en el archivo de historial.
- Existe la historia en la memoria de un proceso bash.
- El historial en la memoria de un proceso bash no se sincroniza con el historial en la memoria de ningún otro proceso bash.
- El historial en la memoria de un proceso bash no se sincroniza con el historial en el archivo, a menos que se solicite explícitamente o durante algún evento específico (ver más abajo).
Usando la configuración predeterminada, el ciclo de vida de una sesión bash con respecto al historial es el siguiente:
- Durante el inicio, bash leerá el archivo de historial. El contenido del archivo de historial está ahora en la memoria del proceso bash.
- Durante el uso normal solo se manipula el historial en la memoria.
- Durante el apagado, el historial en la memoria se escribe en el archivo histórico, sobrescribiendo cualquier contenido anterior del archivo histórico.
El comportamiento aparentemente no determinista que ha observado se debe principalmente a que el contenido del archivo de historial es siempre el historial de la última sesión de bash cerrada, y bash solo lee el archivo de historial durante el inicio.
Lea el manual de bash para obtener una explicación más detallada del proceso de inicio y apagado.
Tenga en cuenta que con la configuración predeterminada me refiero a la configuración predeterminada de bash. Su distribución podría haber proporcionado un .bashrc
(o /etc/bash.bashrc
) que cambie este comportamiento.
Al habilitar la opción de shell histappend
, puede indicarle a bash que agregue en lugar de sobrescribir el archivo de historial. Puede habilitar el histappend
uso del comando shopt -s histappend
. Para tener esta opción siempre habilitada, debe poner el comando en su .bashrc
(u otro archivo de inicialización). Lea más sobre el shopt
comando en el manual de bash
Tenga en cuenta que la habilitación histappend
no reducirá mucho el comportamiento aparentemente no determinista. Esto se debe a que cada sesión de bash todavía tiene su propio historial en la memoria. Es posible tener un historial bash mayormente sincronizado. Hay una guía sobre cómo hacer que cada proceso bash tenga un historial mayormente sincronizado en un hilo en el desbordamiento de la pila .
usando el comando incorporado history
puede decirle explícitamente a bash que lea el historial de un archivo a la memoria, o que escriba de memoria a archivo. Por ejemplo: history -r
leerá el contenido del archivo y lo agregará al historial en la memoria. history -w
escribirá el historial actual de la memoria al archivo, sobrescribiendo el contenido anterior. Esto es básicamente lo que sucede durante el apagado. Lea más sobre el history
comando en el manual de bash
Para completar, aquí hay una lista de las variables internas que modifican el comportamiento del historial:
HISTFILE
: el archivo para leer y escribir el historial.
HISTFILESIZE
: el recuento máximo de líneas para el archivo de historial.
HISTSIZE
: el recuento máximo de líneas para el historial en la memoria.
HISTCONTROL
, HISTIGNORE
, HISTTIMEFORMAT
: No es relevante para esta discusión. Lea el manual de bash para más detalles.