Sé que esta pregunta no es oscura, ya que se hace aquí y se actualiza (y se duplica aquí).
Lo que intento lograr es un poco diferente. No me gusta la idea de que mi mensaje reescriba un archivo cada vez ls
que escribo ( history -a; history -c; history -r
).
Me gustaría actualizar el archivo al salir. Eso es fácil (en realidad, predeterminado), pero debe agregar en lugar de reescribir:
shopt -s histappend
Ahora, cuando un terminal está cerrado, me gustaría que todos los demás que permanecen abiertos estén al tanto de la actualización.
Prefiero hacer esto sin verificar a través $PS1
de todo lo command
que escribo. Creo que sería mejor capturar algún tipo de señal. ¿Cómo lo harías tú? Si no es posible, tal vez un simple cronjob
?
¿Cómo podemos resolver este rompecabezas?
bash
shell
command-history
signals
Dr. Beco
fuente
fuente
bash
. Tal vez es hora de revisar algo nuevo, solo por diversión.Respuestas:
¿Señales creativas e implicantes, dices? OKAY:
Tira eso
.bashrc
y vete. Utiliza señales para indicar a cadabash
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. ElEXIT
evento es cualquier terminación controlada del shell, mientras queUSR1
esSIGUSR1
una señal sin sentido que nos estamos apropiando.Cada vez que sale la cáscara, nosotros:
SIGUSR1
controlador y haga que este shell ignore la señal.bash
procesos en ejecución desde el mismo usuario.Cuando
SIGUSR1
llega un , nosotros: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
enPROMPT_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 otrobash
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: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.
fuente
.bashrc
archivo, y luego hizo que apareciera algo así como un cronjob y recurriera el archivo periódicamente, enviando unSIGUSR1
fragmento según su fragmento, ¿podría recuperar el historial cronológico de flecha hacia arriba?linux bug
? ¿Por qué otros procesos están capturando USR1? (Sé que no está destinado a ser discutido aquí, pero tal vez sacaré esto a la luz en el lugar correcto)BASH_ENV
como se indica en esta respuesta? ¿O conoces una forma más estándar de apagar este mal?