Segnali creativi e coinvolgenti, dici? OK:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Buttalo dentro .bashrc
e vai. Questo utilizza segnali per indicare a ogni bash
processo di verificare la presenza di nuove voci di cronologia quando ne esce un'altra. È piuttosto orribile, ma funziona davvero.
Come funziona?
trap
imposta un gestore di segnale per un segnale di sistema o per uno degli eventi interni di Bash. L' EXIT
evento è qualsiasi terminazione controllata della shell, mentre USR1
è SIGUSR1
un segnale insignificante che ci stiamo appropriando.
Ogni volta che esce la shell, noi:
- Aggiungi esplicitamente tutta la cronologia al file.
- Disabilita il
SIGUSR1
gestore e fai in modo che questa shell ignori il segnale.
- Invia il segnale a tutti i
bash
processi in esecuzione dallo stesso utente.
Quando SIGUSR1
arriva un :
- Carica tutte le nuove voci dal file cronologico nell'elenco cronologico in memoria della shell.
A causa del modo in cui Bash maniglie segnali, non sarà effettivamente ottenere i nuovi dati storici fino a colpire Enterla prossima volta, quindi questo non fa di meglio su questo fronte che mettere history -n
in PROMPT_COMMAND
. Tuttavia, salva la lettura del file costantemente quando non è successo nulla e non c'è alcuna scrittura fino a quando la shell non esce.
Ci sono ancora un paio di problemi qui, tuttavia. Il primo è che la risposta predefinita a SIGUSR1
è terminare la shell. Qualsiasi altro bash
processo (ad esempio l'esecuzione di script shell) verrà interrotto. .bashrc
non viene caricato da shell non interattive. Invece, viene caricato un file chiamato daBASH_ENV
: puoi impostare quella variabile nel tuo ambiente a livello globale per puntare a un file con:
trap '' USR1
in esso per ignorare il segnale in essi (che risolve il problema).
Infine, anche se questo fa quello che hai chiesto, l'ordinazione che riceverai sarà un po 'insolita. In particolare, frammenti di cronologia verranno ripetuti in diversi ordini man mano che vengono caricati e salvati separatamente. Questo è essenzialmente inerente a ciò che stai chiedendo, ma tieni presente che la cronologia delle frecce verso l'alto diventa molto meno utile a questo punto. Le sostituzioni di storia e simili saranno condivise e funzioneranno bene, comunque.