Pérdida de historial de Bash cuando se usa histappend

18

Me gusta mantener mucha historia, así que me he histappendpuesto en mi .bashrc. La mayoría de las veces todo funciona bien, con la historia construida a partir de muchos shells añadidos. Sin embargo, de vez en cuando, comenzaré un nuevo shell y descubriré que he perdido todo el historial, y que a menudo solo contiene algunos de los comandos del último shell para salir (es decir, no es solo sobrescribir en lugar de agregar ) Debido a esto, sospecho que está sucediendo en la salida de shell, en lugar de que algún otro proceso elimine el .bash_historyarchivo. Para respaldar esta conclusión, tengo números de comando de historial en mi solicitud, y nunca los he visto saltar.

¿Alguien se ha encontrado con un problema similar? ¿O incluso solo tiene sugerencias sobre cómo localizar el problema?

Cascabel
fuente

Respuestas:

13

Lamento responder mi propia pregunta, pero ninguna de las otras respuestas realmente aborda el problema.

Finalmente me di cuenta de que esto solo ocurre cuando se cierra gnome-terminal(es decir, archivo> salir, el botón 'x', alt + F4), e incluso entonces generalmente solo cuando se cierran varias terminales en rápida sucesión. Nunca sucede cuando se usa ctrl-D para cerrar el shell, dejando que el terminal lo siga.

Si puedo precisarlo lo suficiente, presentaré un informe de error de gnome-terminal. Mientras tanto, ¡quizás esto ayude a otras personas que llegan aquí desde google!

Cascabel
fuente
10

No tengo idea de por qué sucede esto, pero tal vez pueda evitar el problema forzando a bash a escribir en su archivo de historial cada vez que muestra un mensaje:

PROMPT_COMMAND="history -a; history -n"

Esto escribirá (-a) y luego volverá a leer (-n) el archivo de historial cada vez que bash solicita el siguiente comando. Beneficio adicional: obtendrá el comando X en el shell 1 en la historia del shell 2.

innaM
fuente
No funciona en GNU bash, versión 3.00.15 (1) -release (i686-redhat-linux-gnu)
David Mackintosh
2
¿Puedes explicar qué significa "no funciona"?
innaM
3
El beneficio adicional que usted cita es en muchos casos un inconveniente. No es el comportamiento lo que estoy buscando, ya que puedo estar llevando a cabo dos tareas completamente separadas en capas separadas, y no quiero mezclar su historia. Esto probablemente tampoco ayudaría en nada. Cuando desaparece el historial, se está eliminando el contenido de .bash_history. No espero que importe si se han escrito al salir de la shell o por PROMPT_COMMAND.
Cascabel
55
history -nes escamoso Es más confiable hacerlo history -a; history -c; history -r. Para explicar esto, primero notaré que history -ahace lo correcto: .bash_historycontendrá todos los comandos que escribió, en el orden en que los escribió, suponiendo que se ejecute history -adespués de cada comando. El desafío es mantener sincronizada la idea de la historia del shell con el archivo .bash_history. Esto es fácil con -cy -r, el problema es que podría ser lento si es grande. -npuede romperse porque identifica incorrectamente qué líneas son nuevas. (¡Me estoy quedando sin espacio aquí!)
Aaron McDaid
44
(... si se utiliza -n) Imagine que ejecuta un comando en cáscara de 1: ls. Luego, en otro shell, Shell Two, ejecutas cd. Ahora, el historial en .bash_history es correcto debido a que history -aen su PROMPT_COMMAND- contendrá ls \n cd \n. Luego, regresa al shell One y escribe pwd. Shell One piensa que solo hubo un comando en el historial ( ls). Ahora cree que hay dos comandos ( lsy pwd) en el historial. Cuando lo hace -n, piensa (tengo dos comandos en mi historia, y hay dos comandos en .bash_history, por lo tanto, estoy actualizado.)
Aaron McDaid
3

Mi experiencia fue que los shells actualizaron el archivo de historial al salir. Por lo tanto, la "historia" inicial de un shell dependía de la visión de la historia del shell más reciente.

El resultado de esto es que puede obtener comandos que van y vienen del historial, dependiendo de cómo otros shells comenzaron y se detuvieron.

David Mackintosh
fuente
2
Entiendo muy bien cómo se escribe el archivo de historial; es por eso que especifiqué en mi pregunta que estoy usando histappend. El problema no es el contenido inesperado, sino una pérdida total de contenido previamente almacenado.
Cascabel
Esto explica por qué estaba perdiendo mi historia ...
B Seven
1

He visto que esto sucedió antes, pero fue un problema con los errores de disco que ocurrían con una frecuencia cada vez mayor. Haría un escaneo en el disco. Si resulta que la unidad está bien, comprobaría si este archivo no está superando un límite arbitrario de historial de shell.

Algo que podría evitar que eso suceda sería seguir reduciendo el archivo a 80 líneas o la cantidad de comandos que desee que sea el historial.

Axxmasterr
fuente
No tengo acceso de root en la máquina, esto está sucediendo, pero estoy bastante seguro de que la unidad está bien. Mi directorio de inicio está almacenado en un servidor en nuestro laboratorio (un montón de RAID, creo) y montado en nfs. ¿Qué quiere decir con "límite arbitrario de historial de shell"? Todo esto está sucediendo muy por debajo de HISTSIZE y HISTFILESIZE, y aunque ambas he establecido en grande, están muy por debajo de la intbash las almacena como.
Cascabel
Debo decir que la entrada de David Mackintosh es probablemente lo que está sucediendo.
Axxmasterr
1
Estoy completamente seguro de que no lo es. Debería nunca se terminan con sólo dos comandos en mi historia, cuando el último cáscara para salir tenía un par de docenas comandos, el archivo de la historia había varios cientos, y HISTSIZE / HISTFILESIZE se establece en 10000.
Cascabel