Por alguna razón, no puedo hacer que mi sistema mantenga mi historial de BASH después de un reinicio. Aquí están las secciones relevantes de mi ~/.bashrc
:
shopt -s histappend
PROMPT_COMMAND='history -a; updateWindowTitle'
export HISTCONTROL=ignoredups
export HISTSIZE=9999
export HISTFILESIZE=999999
export HISTFILE="$HOME/.bash_history"
Por lo que puedo decir, esas son todas las opciones necesarias ( sé que solía poder mantener el historial en varios reinicios sin todo esto en el pasado). Sin embargo, a pesar de haber agregado estas opciones hace varios reinicios, todavía pierdo la mayor parte de mi historial después de un reinicio. No está vacío, pero no tiene las 9999 líneas que tenía antes de reiniciar.
Antes de que nadie se queje, sí, he leído estas preguntas. He implementado algunas de sus sugerencias como se mencionó anteriormente, el resto no fueron útiles o no relevantes:
- Pérdida de historial de Bash cuando se usa histappend
- ¿Cómo evitar que Bash altere el historial?
- ¿Qué determina lo que aparece en el comando bash history?
- ¿Cómo mantengo mi historial de bash en las sesiones?
- guardar el historial de bash regularmente
En el caso de que pueda haber otros comandos relevantes allí, puede ver mi entero ~/.bashrc
aquí .
Entonces, ¿qué me estoy perdiendo? ¿Por qué no se guarda mi historia? Si alguien piensa que otro archivo puede ser relevante, hágamelo saber y lo publicaré. Lo comprobé ejecutando grep -i hist \.*
mi $HOME
que mostró que el único .
archivo relevante que contiene la cadena hist
o HIST
era .bashrc
.
Estoy ejecutando Linux Mint Debian Edition, GNU bash, versión 4.2.36 (1) -release (x86_64-pc-linux-gnu) y mi emulador de terminal favorito (en caso de que sea relevante) es terminator
.
ACTUALIZAR:
Siguiendo la sugerencia de @ mpy en los comentarios, cambié mi ~/.bashrc
configuración para establecerla HISTFILE=~/bash_history
en lugar de la predeterminada ~/.bash_history
y eso parece resolver el problema de los shells interactivos . Los shells de inicio de sesión todavía muestran el mismo comportamiento, con el historial truncado en las 500
líneas. Sin embargo, no hay HIST
variables relacionadas establecidas en los archivos relevantes:
$ for f in /etc/profile ~/.profile ~/.bash_profile ~/.bash_login; do \
echo -ne "$f :"; echo `grep HIST $f`; \
done
/etc/profile :
/home/terdon/.profile :grep: /home/terdon/.profile: No such file or directory
/home/terdon/.bash_profile :grep: /home/terdon/.bash_profile: No such file or directory
/home/terdon/.bash_login :grep: /home/terdon/.bash_login: No such file or directory
$ grep -r HIST /etc/profile.d/ <-- returns nothing
Entonces, ¿por qué la configuración HISTSIZE
y HISTFILESIZE
en el ~/.bashrc
no es suficiente a menos que establezca explícitamente $HISTFILE
algo diferente al predeterminado ~/.bash_history
?
history
comando, ¿la salida que ve es idéntica a la que ve, en ejecucióncat .bash_history
, además de los números de línea? Quiero decir, ¿elhistory
comando muestra marcas de tiempo u otra información? La razón por la que le pregunto es que si ve estas cosas esotéricas, significa que hay otro módulo / función / programa, que está interfiriendo con el historial de shell y una versión incorrecta o defectuosa de lo que sea, podría estar causándole dolor. .;)
: pruebe con otro archivo como HISTFILE, no el predeterminado~/.bash_history
. Explicación muy construida: supongo que bash es su shell predeterminado, por lo que al iniciar el sistema, un shell no interactivo es el padre de su sesión X (también supongo que usa X), que no sabrá nada sobre la opción histappend (ya que .bashrc es solo leer por shells interactivos), por lo tanto, mientras este shell padre se ejecute todo está bien, pero al finalizar (es decir, detener el sistema) se anulará~/.bash_history
(que es el valor predeterminado) y desordenará su historial ...Respuestas:
El problema realmente se reduce al comportamiento diferente de los shells de inicio de sesión y no inicio de sesión. Había establecido las variables que controlan el historial en mi
~/.bahsrc
. Este archivo no se lee cuando se inicia un shell de inicio de sesión, solo se lee mediante shells interactivos sin inicio de sesión (desdeman bash
):Por lo tanto, cada vez que inicie sesión, o caiga en un tty, o use ssh, el
.history
archivo se trunca porque no lo configuré en el tamaño correcto~/.profile
también. Finalmente me di cuenta de esto y simplemente establecí las variables en~/.profile
donde pertenecen , en lugar de~/.bashrc
Entonces, la razón por la cual mi
~/.history
truncamiento se debía a que solo había configurado las variables HISTORIAL en un archivo leído por shells interactivos, sin inicio de sesión y, por lo tanto, cada vez que ejecutaba un tipo diferente de shell, las variables se ignoraban y el archivo se cortaba en consecuencia.fuente
.bashrc
no es leída por (shells no interactivos O de inicio de sesión).export BASH_ENV=~/.bashrc ; if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
... y en la parte superior de ~ / .bashrc, marque para asegurarse de que realmente se está ejecutando de forma interactiva:[ -z "$PS1" ] && return
... Por supuesto, es solo un idioma.BASH_ENV
no es relevante, solo afecta a los shells no interactivos. En cuanto al "idioma", es algo que Debian comenzó y con el que personalmente no estoy de acuerdo. A menudo tengo opciones gráficas (xset
y similares) en mi .bashrc y no quiero que estén activas cuando ejecuto shells de inicio de sesión, ya sea desde un tty o a través dessh
. Yo quiero mi .profile y Bashrc separado. Muchos (aunque no todos) los administradores de inicio de sesión obtienen el perfil .profile cuando inicia sesión, por lo que las variables globales se configuran mejor allí donde solo se leerán una vez y no cada vez que abra un terminal.~/.profile
o~/.bashrc
) se leen al final. Cualquier cosa establecida en ellos tendrá prioridad sobre la configuración global. Tienes toda la razón, no deberías configurar esas variables/etc/bash.bashrc
. Use~/.profile
(o~/.bash_profile
) en su lugar.Mi sugerencia es usar otro archivo como
HISTFILE
, no el predeterminado~/.bash_history
.Aunque no tengo una explicación analítica, trataré de describir lo que me llevó a esta sugerencia: si usa
bash
su shell predeterminado (inicio de sesión) y también usaX
(lo cual es muy probable), tiene unabash
instancia en ejecución justo después de la (gráfica ) iniciar sesión:Creo que esta instancia es un shell de inicio de sesión, por lo que no lee su
~/.bashrc
y, por lo tanto, no sabrá nada sobre lahistappend
opción:Mientras se ejecute este "shell principal", todo estará bien, pero al finalizar (es decir, detener el sistema) se anulará
~/.bash_history
(porque ese es el valor predeterminado) y desordenará su historial o lo recortará en el inicio del sistema (nuevamente predeterminado) 500 líneas. (O tal vez ambos ...)También me parece que no es suficiente incluir la configuración del historial
~/.bashrc
, ya que esta no debería ser una configuración tan poco común. No tengo explicación para eso.Con respecto a su problema, que "los shells de inicio de sesión todavía muestran el mismo comportamiento", puede intentar incluir la configuración del historial también en
~/.bash_profile
:Lamentablemente, no puedo publicar una explicación más justificada con detalles de mi propia
bash
configuración, ya que soy unzsh
chico ...fuente
~/.bash_profile
resolvió el problema. Ahora estoy usando~/.bash_history
como mi archivo de historial, pero simplemente he agregado todas las líneas que se~/.bashrc
muestran en mi pregunta~/.bash_profile
. Todavía no estoy seguro de quién estaba arruinando los shells interactivos, pero parece funcionar ahora, ¡gracias!Dado que todas sus configuraciones están en orden de acuerdo con la página de manual, y dado que el archivo de historial no está restringido por tamaño (bytes), la única explicación posible que se me ocurre. Tiene que ver con cómo muere el caparazón.
Según la referencia en línea, la salida elegante (historial guardado) ocurre solo cuando el shell recibe SIGHUP. Realmente no puedo explicar cómo su sistema propaga señales cuando se reinicia, pero sospecho que su shell se cierra con SIGKILL o SIGPWR.
Podría deberse a que su WM se ejecuta de forma asíncrona (espera) y el emulador de terminal se generó desde el WM donde bash recibe una señal de salida forzada que no es SIGHUP. También podría ser que el sistema operativo envíe rápidamente la "eliminación final" a todos los procesos antes de que el SIGHUP inicial elegante logre llegar al shell a través de X -> WM -> xterm, posiblemente porque X o WM tardan más en salir que se necesita que el sistema operativo esté listo para fallar.
Estoy en aguas profundas con estas cosas, pero creo que algo en ese sentido causa un comportamiento errático. He tenido este problema antes, y el remedio más sólido es
exit
en bash donde quieres mantener el historial.Me di cuenta
history -a
en su pregunta, y no puedo pensar por qué eso no sería suficiente para preservar la historia.Puede solucionar el problema averiguando qué es lo que realmente mata a su golpe y pasar a averiguar dónde se origina la señal y solucionar el problema allí, o simplemente borrar el historial cuando sepa qué señal es la última (suponiendo que los discos todavía estén en línea para entonces ):
La captura de pantalla incluida ilustra de lo que estoy hablando en el segundo y tercer párrafos. La secuencia allí es I shell in from left , mata el shell izquierdo de la derecha y cat el historial.
hombre bash
referencia en línea
captura de pantalla demostrativa
fuente
/tmp/pso
que estás matando? Veo su punto sobre las diferentes señales de muerte (aunque, como usted dice, pensé que eso es lohistory -a
que hay que tratar). Probaré eso por un tiempo e informaré de nuevo.Verifique / etc / profile y /etc/profile.d/*
Tal vez hay algo que interfiere con la configuración del historial allí.
fuente
grep -r HIST /etc/profile.d/
no devuelve nada, y ya lo he comprobado/etc/profile
.