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 .bashrce vai. Questo utilizza segnali per indicare a ogni bashprocesso di verificare la presenza di nuove voci di cronologia quando ne esce un'altra. È piuttosto orribile, ma funziona davvero.
Come funziona?
trapimposta un gestore di segnale per un segnale di sistema o per uno degli eventi interni di Bash. L' EXITevento è qualsiasi terminazione controllata della shell, mentre USR1è SIGUSR1un segnale insignificante che ci stiamo appropriando.
Ogni volta che esce la shell, noi:
- Aggiungi esplicitamente tutta la cronologia al file.
- Disabilita il
SIGUSR1gestore e fai in modo che questa shell ignori il segnale.
- Invia il segnale a tutti i
bashprocessi in esecuzione dallo stesso utente.
Quando SIGUSR1arriva 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 -nin 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 bashprocesso (ad esempio l'esecuzione di script shell) verrà interrotto. .bashrcnon 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.