Planteamiento del problema
He estado siguiendo numerosos ejemplos para hacer cosas creativas con el historial de bash como:
# simplified example
PROMPT_COMMAND='history -a; history -c; history -r'
... pero parecía funcionar de forma intermitente. Si el archivo de historial ya existe con el historial anterior, entonces todo está bien.
Otra información relevante
- Versiones de bash: 3.2.51, 4.1.2 y 4.2.45
- 4.2.x no parece tener este problema, pero es una instalación no predeterminada
- Sistema operativo: Linux y Solaris
- El directorio de inicio está montado en NFS.
Pasos de diagnóstico
Me deshice de mi .bashrc
y lo configuré .bash_profile
en:
HISTFILE=$HOME/.bash_history.test
Luego iniciaría un shell de inicio de sesión (por ejemplo, ssh a otra máquina) y haría algo como lo siguiente:
~ cat .bash_history.test
cat: .bash_history.test: No such file or directory
~ history
1 cat .bash_history.test
2 history
~ history -a
~ !-3
cat .bash_history.test
cat: .bash_history.test: No such file or directory
El archivo de historial no se agregará en history -a
las siguientes circunstancias:
- El archivo aún no existe
- El archivo está vacío o solo contiene nuevas líneas; incluso los espacios en blanco harán que funcione
... sin embargo, cuando el shell salehacecrearlo. A partir de entonces, history -a
funciona como se esperaba... excepto cuando PROMPT_COMMAND="history -a; history -c; history -r"
. Cuando configuré eso, incluso salir del Shell no creó el archivo de historial (a menos que lo ejecutara exec bash
primero).
Luego probé con una instalación no estándar de bash (4.2.x) y el problema no se manifestó.
Respuesta1
Este hilo de la lista de correoparece explicar estos problemas; citando el segundo mensaje:
El código actual en bashhist.c:maybe_append_history() (que ha existido durante al menos 15 años) parece no manejar el caso en el que el número de líneas del historial en la sesión actual es igual al número de entradas de la lista del historial. Es decir, el código no agregará nuevas líneas si cree que no se leyeron líneas del archivo histórico cuando se inició el shell. Eso parece incorrecto y adjunto un parche que lo soluciona. Sin embargo, el código ha existido en su forma actual durante tanto tiempo que me pregunto si existe alguna otra razón para ello.
(Chet Ramey, lista de correo de GNU bash)
Además, elregistro de cambiospara 4.2 tiene el siguiente texto:
+ 8/13
+ ----
+bashhist.c
+ - in maybe_append_history, change check for history_lines_this_session
+ so that we append the lines to the file if it's equal to the value
+ returned by where_history(). This means that without this change,
+ the history won't be appended if all the lines in the history list
+ were added in the current session since the last time the history
+ file was read or written. Fixes bug reported by Bruce Korb
+ <[email protected]>
(git.savannah.gnu.org, bash git repo)
Obviamente necesitamos instalar una versión más reciente de bash para resolver este problema.
Esperemos que esto ayude a alguien más en el futuro.