Me gusta mantener mucha historia, así que me he histappend
puesto 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_history
archivo. 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?
Respuestas:
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!
fuente
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:
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.
fuente
history -n
es escamoso Es más confiable hacerlohistory -a; history -c; history -r
. Para explicar esto, primero notaré quehistory -a
hace lo correcto:.bash_history
contendrá todos los comandos que escribió, en el orden en que los escribió, suponiendo que se ejecutehistory -a
despué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-c
y-r
, el problema es que podría ser lento si es grande.-n
puede romperse porque identifica incorrectamente qué líneas son nuevas. (¡Me estoy quedando sin espacio aquí!)-n
) Imagine que ejecuta un comando en cáscara de 1:ls
. Luego, en otro shell, Shell Two, ejecutascd
. Ahora, el historial en .bash_history es correcto debido a quehistory -a
en suPROMPT_COMMAND
- contendráls \n cd \n
. Luego, regresa al shell One y escribepwd
. Shell One piensa que solo hubo un comando en el historial (ls
). Ahora cree que hay dos comandos (ls
ypwd
) 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.)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.
fuente
histappend
. El problema no es el contenido inesperado, sino una pérdida total de contenido previamente almacenado.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.
fuente
int
bash las almacena como.