¿Señales creativas e implicantes, dices? OKAY:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Tira eso .bashrc
y vete. Utiliza señales para indicar a cada bash
proceso que verifique si hay nuevas entradas en el historial cuando sale otra. Esto es bastante horrible, pero realmente funciona.
¿Como funciona?
trap
establece un controlador de señal para una señal del sistema o uno de los eventos internos de Bash. El EXIT
evento es cualquier terminación controlada del shell, mientras que USR1
es SIGUSR1
una señal sin sentido que nos estamos apropiando.
Cada vez que sale la cáscara, nosotros:
- Agregue todo el historial al archivo explícitamente.
- Inhabilite el
SIGUSR1
controlador y haga que este shell ignore la señal.
- Envíe la señal a todos los
bash
procesos en ejecución desde el mismo usuario.
Cuando SIGUSR1
llega un , nosotros:
- Cargue todas las entradas nuevas del archivo de historial en la lista de historial en memoria del shell.
Debido a la forma en que Bash maneja las señales, en realidad no obtendrá los nuevos datos del historial hasta que llegue Enterla próxima vez, por lo que esto no funciona mejor en ese frente que poner history -n
en PROMPT_COMMAND
. Sin embargo, guarda la lectura del archivo constantemente cuando no ha sucedido nada, y no hay ninguna escritura hasta que se cierra el shell.
Sin embargo, todavía hay un par de problemas aquí. La primera es que la respuesta predeterminada SIGUSR1
es terminar el shell. Cualquier otro bash
proceso (ejecutando scripts de shell, por ejemplo) será eliminado. .bashrc
no se carga con shells no interactivos. En su lugar, se carga un archivo nombrado porBASH_ENV
: puede configurar esa variable en su entorno globalmente para que apunte a un archivo con:
trap '' USR1
en él para ignorar la señal en ellos (que resuelve el problema).
Finalmente, aunque esto hace lo que pediste, el pedido que recibas será un poco inusual. En particular, los fragmentos de la historia se repetirán en diferentes órdenes a medida que se cargan y guardan por separado. Eso es esencialmente inherente a lo que está pidiendo, pero tenga en cuenta que el historial de flecha hacia arriba se vuelve mucho menos útil en este momento. Sin embargo, las sustituciones de historia y similares se compartirán y funcionarán bien.