Utilicé la respuesta en /unix//a/1292/41729 para habilitar el historial compartido en tiempo real entre terminales de bash separadas. Como se explica en la respuesta anterior, esto se logra agregando:
# 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 de bash están separados (por ejemplo, abriendo diferentes terminales de bash usando CTRL+ALT+T
. Sin embargo, no funciona si uso tabs
(desde un terminal abierto `CTRL + SHIFT + T) en lugar de nuevas ventanas. ¿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 CTRL + C fuerza un vaciado 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!
~.bashrc
archivo? En una nota al margen, exportar esas variables no tiene sentido; solo desperdicia espacio ambiental.Respuestas:
Parece que está intentando acceder al historial del otro terminal antes de que se realice la sincronización.
PROMPT_COMMAND
se ejecuta justo antes de que se imprima una nueva solicitud, 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 una nueva solicitud.Para probar esto, pruebe esta variante en sus pasos (agregué un extra
<enter>
en T1):Con esta presión adicional de enter, obtienes un nuevo mensaje, que se ejecuta
PROMPT_COMMAND
y sincroniza tu historial, por lo que esperaría que esta flecha hacia arriba recupere el encd
lugar dells
, como quisieras. Desafortunadamente, 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; efectivamente, esto requeriría que todas sus sesiones de inicio de sesión estén sincronizando sus listas de historial continuamente todo el tiempo, lo que sería una gran pérdida de rendimiento de CPU y disco.fuente
Hice la misma pregunta y aquí está la respuesta que se me ocurrió ...
fuente
HISTFILESIZE
se cambia, intenta automáticamente truncar el archivo de historial existente. El cambioHISTSIZE
tiene un efecto similar en el historial actual. Como referencia, vea el comentario envariables.c
bash src justo antessv_histsize
.agrega esas líneas a tu
.bashrc
archivoNota:
Inicialmente, hice mi compartimento de prueba enviando la señal USR1 a bash con killall, luego pensé en usar un nombre de shell único, una copia de bash llamada testhell, para evitar matar mis propios shells que podrían ejecutarse (procesos cron por ejemplo) pero extrañamente eso no era trabajando.
El killall no fue lo suficientemente selectivo, lo reemplacé con un script que mata solo los procesos bash ajustados a un tty (
ps a
informa solo procesos vinculados a un tty)No olvide reiniciar su sesión para tener un PROMPT_COMMAND nuevo, cuando estaba probando vi muchas de mis pruebas anteriores apiladas dentro de PROMPT_COMMAND.
fuente
killall
que envíe la señal solo a los procesos del mismo usuario con un-u
argumento adicional, e.g.
-u $ (whoami) `.killall -q -USR1 -u $(whoami) bash
envía la señal USR1 a todos los procesos de bash del usuario actual.Tuve el mismo comportamiento extraño en Yakuake cuando intenté crear un indicador de bash elaborado que mostrara el número de otros inicios de sesión. El número no aumentó para las pestañas. Mi solución era decirle a Yakuake que se ejecutara
bash
nuevamente en cada pestaña nueva, esencialmente comenzando bash en bash. Comenzó a funcionar sin problemas. Puede ser que también te ayude. Mi suposición ciega es que la GUI para la consola carga las configuraciones de bash y luego las alimenta a las instancias de bash. Puede ser para poder jugar con ellos.fuente