Kreative und involvierende Signale, sagst du? IN ORDNUNG:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Chuck das rein .bashrcund los. Hierbei werden Signale verwendet, um jedem bashProzess mitzuteilen, dass beim Beenden eines anderen Prozesses nach neuen Verlaufseinträgen gesucht werden soll. Das ist ziemlich schrecklich, aber es funktioniert wirklich.
Wie funktioniert es?
trapLegt einen Signal-Handler für ein Systemsignal oder eines der internen Ereignisse von Bash fest. Das EXITEreignis ist eine kontrollierte Beendigung der Shell, während USR1es SIGUSR1sich um ein bedeutungsloses Signal handelt, das wir uns zu Eigen machen.
Wann immer die Shell beendet wird, werden wir:
- Hängen Sie den gesamten Verlauf explizit an die Datei an.
- Deaktivieren Sie den
SIGUSR1Handler und lassen Sie diese Shell das Signal ignorieren .
- Senden Sie das Signal an alle laufenden
bashProzesse desselben Benutzers.
Wenn ein SIGUSR1kommt, wir:
- Laden Sie alle neuen Einträge aus der Verlaufsdatei in die speicherinterne Verlaufsliste der Shell.
Aufgrund der Art und Weise Bash Griff Signale, werden Sie nicht tatsächlich die neuen History - Daten, bis Sie schlagen Enterdas nächste Mal, so dass dies nicht besser an dieser Front macht als Putting history -nin PROMPT_COMMAND. Es spart jedoch, die Datei ständig zu lesen, wenn nichts passiert ist, und es wird überhaupt nicht geschrieben, bis die Shell beendet wird.
Hier gibt es jedoch noch einige Probleme. Die erste ist, dass die Standardantwort auf SIGUSR1das Beenden der Shell ist. Alle anderen bashProzesse (z. B. das Ausführen von Shell-Skripten) werden abgebrochen. .bashrcwird nicht von nicht interaktiven Shells geladen. Stattdessen wird eine Datei mit dem Namen BASH_ENVgeladen : Sie können diese Variable in Ihrer Umgebung global so einstellen, dass sie auf eine Datei zeigt mit:
trap '' USR1
darin das Signal in ihnen zu ignorieren (was das Problem löst).
Obwohl dies genau das tut, wonach Sie gefragt haben, wird die Reihenfolge, die Sie erhalten, etwas ungewöhnlich sein. Insbesondere werden Teile der Historie in unterschiedlicher Reihenfolge wiederholt, wenn sie separat geladen und gespeichert werden. Dies ist im Wesentlichen das, wonach Sie fragen. Beachten Sie jedoch, dass die Aufwärtspfeil-Historie an dieser Stelle weitaus weniger nützlich ist. Geschichtsersetzungen und dergleichen werden jedoch geteilt und funktionieren gut.