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 .bashrc
und los. Hierbei werden Signale verwendet, um jedem bash
Prozess 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?
trap
Legt einen Signal-Handler für ein Systemsignal oder eines der internen Ereignisse von Bash fest. Das EXIT
Ereignis ist eine kontrollierte Beendigung der Shell, während USR1
es SIGUSR1
sich 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
SIGUSR1
Handler und lassen Sie diese Shell das Signal ignorieren .
- Senden Sie das Signal an alle laufenden
bash
Prozesse desselben Benutzers.
Wenn ein SIGUSR1
kommt, 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 -n
in 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 SIGUSR1
das Beenden der Shell ist. Alle anderen bash
Prozesse (z. B. das Ausführen von Shell-Skripten) werden abgebrochen. .bashrc
wird nicht von nicht interaktiven Shells geladen. Stattdessen wird eine Datei mit dem Namen BASH_ENV
geladen : 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.