bash: historial -a no escribir a menos que HISTFILE ya tenga texto

bash: historial -a no escribir a menos que HISTFILE ya tenga texto

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 .bashrcy lo configuré .bash_profileen:

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 -alas 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 -afunciona 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 bashprimero).

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.

información relacionada