Cómo compartir el historial compartido entre diferentes pestañas

19

Utilicé la respuesta en enlace para habilitar el historial compartido en tiempo real entre los terminales bash separados. Como se explicó en la respuesta anterior, esto se logra al agregar:

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Esto funciona bien si los shells bash están separados (por ejemplo, abriendo diferentes terminales bash usando CTRL+ALT+T . Sin embargo, no funciona si uso tabs (desde un terminal abierto 'CTRL + SHIFT + T) en lugar de nuevo Windows. ¿Por qué esta diferencia de comportamiento? ¿Cómo puedo compartir el historial de bash también entre varias pestañas?

ACTUALIZACIÓN: noté un comportamiento inusual: si escribo CTRL+C , el último comando escrito en cualquiera de los otros terminales (tanto una pestaña como no) se muestra correctamente. Es como si el CTRL + C obliga a un lavado del historial para que luego se comparta correctamente.

Como ejemplo, las salidas (T1 denota el terminal 1 y el terminal 2 de T2):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed

¡Espero que esto pueda ofrecer alguna pista!

    
pregunta lucacerone 23.06.2013 - 18:25

4 respuestas

2

Parece que estás tratando de acceder al historial del otro terminal antes de que se realice la sincronización. PROMPT_COMMAND se ejecuta justo antes de que se imprima un nuevo mensaje, es decir, después de ejecutar un comando y antes de escribir el siguiente comando. Por lo tanto, no sucederá de inmediato en T1; debe hacer que se muestre un nuevo mensaje.

Para probar esto, prueba esta variante en tus pasos (agregué un <enter> adicional en T1):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<enter>
<up> (i.e. I press the up arrow)

Con esta presión adicional de enter, obtienes un nuevo mensaje, que ejecuta PROMPT_COMMAND y sincroniza tu historial, por lo que esperaba que esta flecha ascendente recuperara el cd en lugar del ls , como querías . Lamentablemente, no creo que haya una manera de hacer que la sincronización ocurra instantáneamente en todos los terminales sin ejecutar ningún comando como parece querer; de hecho, esto requeriría que todas sus sesiones de inicio de sesión estén sincronizando sus listas de historial de forma continua todo el tiempo, lo que supondría un enorme desperdicio de rendimiento de CPU y disco.

    
respondido por el Paul 28.06.2013 - 20:08
1

Hice la misma pregunta y aquí está la respuesta que se me ocurrió ...

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

history() {
  _bash_history_sync
  builtin history "$@"
}

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

PROMPT_COMMAND=_bash_history_sync
    
respondido por el Scott Goodgame 26.06.2013 - 10:38
1

agrega esas líneas a tu archivo .bashrc

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

trap 'history -r' USR1 
export PROMPT_COMMAND="history -a ; history -c; ps a | awk '/ bash$/ {system (\"kill -USR1 \" $1)}'; $PROMPT_COMMAND"

nota:

Inicialmente hice mi bahía de prueba enviando señal USR1 para golpear con killall, luego pensé usar un nombre de shell único, una copia bash llamada testshell, para evitar matar mis propias shells que podrían ejecutarse (procesos cron por ejemplo) pero extraños eso no estaba funcionando.

El killall no fue lo suficientemente selectivo, lo reemplacé con un script que mata solo los procesos de bash a tty ( ps a informa solo los procesos vinculados a un tty)

No te olvides de reiniciar tu sesión para tener un PROMPT_COMMAND nuevo, cuando estaba probando, vi muchas de mis pruebas anteriores apiladas dentro de PROMPT_COMMAND.

    
respondido por el Emmanuel 01.07.2013 - 17:46
0

Tuve el mismo comportamiento extraño en Yakuake cuando intenté crear un elaborado aviso de bash que mostrara el número de otros inicios de sesión. El número no aumentó para las pestañas. Mi solución fue decirle a Yakuake que ejecute bash nuevamente en cada nueva pestaña, esencialmente comenzando bash en bash. Comenzó a funcionar sin problemas. Puede ser que te ayude también. Mi suposición ciega es que la GUI para cargas de consola bash se configura a sí misma y luego las alimenta a las instancias de bash. Puede ser que sea para poder jugar con ellos.

    
respondido por el Barafu Albino 26.06.2013 - 10:41

Lea otras preguntas en las etiquetas