Manejo del historial de bash con múltiples terminales

110

Utilizo principalmente Terminator, y generalmente se abre con 3 ventanas de terminal divididas. También uso el terminal Gnome por varias razones.
Me pregunto cómo se maneja el historial de bash en este caso, ya que a veces extraño los comandos emitidos anteriormente cuando ejecutohistory

Por ejemplo, mi mensaje muestra la línea de historial de bash actual ( \!) y si inicio Terminator con 3 ventanas de terminal divididas, obtengo la misma línea de historial (digamos 100) en todas las terminales. ¿Qué historia se guardará?

También al iniciar Gnome Terminal después de usar Terminator, obtengo la línea 100 al inicio, independientemente de todos los comandos emitidos anteriormente en Terminator

zetah
fuente

Respuestas:

107

La sesión de bash que se guarda es la del terminal que se cierra la última vez. Si desea guardar los comandos para cada sesión, puede usar el truco explicado aquí .

export PROMPT_COMMAND='history -a'

Para citar la página de manual: "Si se establece, el valor se ejecuta como un comando antes de emitir cada solicitud principal".

Por lo tanto, cada vez que mi comando ha finalizado, agrega el elemento del historial no escrito ~/.bash_historyantes de mostrar el indicador (solo $ PS1) nuevamente.

Entonces, después de poner esa línea /etc/bash.bashrc, no tengo que encontrarme reinventando las ruedas o perder segundos valiosos volviendo a escribir cosas solo porque era flojo con mis terminales.

De todos modos, deberá tener en cuenta que los comandos de diferentes sesiones se mezclarán en su archivo de historial, por lo que no será tan fácil leerlo más tarde.

Ver también:

jcollado
fuente
¿No se almacena por separado para diferentes TTL?
Vineet Menon
Excelente. Gracias por la explicación y la solución. Lo intenté export PROMPT_COMMAND='history -a; history -r'y obtuve algunos números de línea de historial extraños en la terminal; después de emitir algunos saltos de número de línea de historial de comandos en 2000 en lugar de 1, lo cual es extraño pero se comporta como se dijo: todo el historial de terminales se guarda.
zetah
@VineetMenon Para más detalles mira aquí . Partes interesantes: cuando se inicia el shell, el historial se inicializa desde el archivo nombrado por la variable HISTFILE (predeterminado `~ / .bash_history '). [...] Cuando sale un shell interactivo, las últimas líneas $ HISTSIZE se copian de la lista del historial al archivo nombrado por $ HISTFILE.
jcollado
Este sitio web parece inactivo: northernmost.org/blog/flush-bash_history-after-each-command
Shubham
32

Después de varias lecturas de man bash, uso archivos de historial separados para cada shell. Hice un y mkdir -m 0700 ~/.historyluego agregué

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

a mi ~/.bashrc. De vez en cuando, recuerdo du -sk .historylimpiarlo. Es bueno tener cada comando que he escrito preservado para mí.

Acabo de usar lo anterior para ver lo que había estado haciendo últimamente:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
o
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(para incluir el primer argumento, por ejemplo, sudo mounten la cadena de clasificación).

Waltinator
fuente
3
¿Por qué asignas HISTFILESIZEdos veces?
Daniel
2
Al establecer HISTFILESIZE en 0, borro el búfer de historial y restablezco el mecanismo de guardado de historial. Luego, configuro el tamaño que realmente quiero y empiezo a guardar el historial en HISTFILE. Vea la sección HISTORIA de man bash.
waltinator
1
¿Hay alguna manera de fusionar los archivos del historial para que el Ctrl+rtrabajo vuelva a funcionar?
n611x007
3
Esta debería ser una nueva pregunta, pero no creo que sea una buena idea. En su lugar, uso egrep 'whatever' .history/*(o cat .history/* | egrep 'whatever'), y uso Ctrl-r para buscar el historial de una sesión individual. Lea man bash-builtinssobre el comando de historia. Mi sort .history/* | uniq -c | sort -n | wc -lmuestra 16033 comandos únicos, cut '-d ' -f1 .history/* | sort | uniq -c | sort -nmuestra 2004 comandos únicos, principalmente errores tipográficos. Cargar todo eso en la "lista de historial" de bash no ayudaría.
waltinator
@waltinator: sé que este es un comentario antiguo, pero ¿estás insinuando que establecer una variable de entorno de alguna manera desencadena una acción inmediata? ¿Qué proceso recogerá el hecho de que asignó un valor de 0 a HISTFILESIZE en un shell local y luego cambiará inmediatamente a 4096? ¿Es esto algo indocumentado sobre el manejo de bash de ciertos nombres de variables?
no sincronizado
8

Para mostrar historydesde todas las terminales:

Añadir export PROMPT_COMMAND='history -a; history -r'a su archivo .bashrc.

Fuente: http://northernmost.org/blog/flush-bash_history-after-each-command


Elijah Lynn
fuente
3
Diré que después de un par de meses de usar esto, eventualmente comenté esto recientemente. Es agridulce ya que no siempre quiero examinar los últimos 100 comandos solo para ejecutar el que había ejecutado originalmente en el panel de Tmux. A veces puedo tener un comando de registro dedicado en el que necesito reiniciar.
Elijah Lynn
Una buena solución que ofrece la concha de pescado es a history --merge. He estado usando esto durante un año más o menos y resuelve el problema. Cuando quiero el historial más reciente de otras sesiones, solo ejecuto ese comando y está disponible para mí al instante.
Elijah Lynn
No se necesita exportar.
Expiación limitada
6

Vea también " mantener el historial persistente en bash " para otra alternativa. Prepara su mensaje para enviar todos los comandos escritos en cualquier terminal en un archivo de "historial persistente" (junto con lo que generalmente se hace para el regular .history).

Eli Bendersky
fuente
1
Inserté $$ para hacer la línea. echo $$ $date_part "$command_part" >> ~/.persistent_historyEsto antepone las entradas con los PID de su proceso bash, para que podamos desenredar múltiples historias.
Evgeni Sergeev
¿Se puede hacer que el historial alternativo funcione con la búsqueda de historial CTRL-R?
max