Ich weiß, dass diese Frage nicht unklar ist, da sie hier weiter aktualisiert (und hier dupliziert ) wird.
Was ich versuche zu erreichen, ist ein bisschen anders. Mir gefällt die Idee nicht, dass meine Eingabeaufforderung bei jeder Eingabe eine Datei neu schreibt ls
( history -a; history -c; history -r
).
Ich möchte die Datei beim Beenden aktualisieren. Das ist einfach (eigentlich Standard), aber Sie müssen anhängen, anstatt neu zu schreiben:
shopt -s histappend
Wenn jetzt ein Terminal geschlossen wird, möchte ich alle anderen, die offen bleiben, auf das Update aufmerksam machen.
Ich ziehe es vor, dies zu tun, ohne $PS1
bei jedem command
, den ich tippe , nachzusehen. Ich denke, es wäre besser, ein Signal zu erfassen. Wie würdest du das machen? Wenn nicht möglich, vielleicht eine einfache cronjob
?
Wie können wir dieses Rätsel lösen?
quelle
bash
. Vielleicht ist es Zeit, etwas Neues zu prüfen, nur zum Spaß.Antworten:
Kreative und involvierende Signale, sagst du? IN ORDNUNG:
Chuck das rein
.bashrc
und los. Hierbei werden Signale verwendet, um jedembash
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. DasEXIT
Ereignis ist eine kontrollierte Beendigung der Shell, währendUSR1
esSIGUSR1
sich um ein bedeutungsloses Signal handelt, das wir uns zu Eigen machen.Wann immer die Shell beendet wird, werden wir:
SIGUSR1
Handler und lassen Sie diese Shell das Signal ignorieren .bash
Prozesse desselben Benutzers.Wenn ein
SIGUSR1
kommt, wir: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
inPROMPT_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 anderenbash
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 NamenBASH_ENV
geladen : Sie können diese Variable in Ihrer Umgebung global so einstellen, dass sie auf eine Datei zeigt mit: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.
quelle
.bashrc
Datei aktiviert haben und dann in regelmäßigen Abständen so etwas wie einen Cronjob durchgeführt und die Datei neu sortiert haben und ein Snippet nach Ihren Wünschen gesendet habenSIGUSR1
, um festzustellen, ob Sie die chronologische Aufwärtspfeil-Historie wiederherstellen konnten.linux bug
?? Warum fangen andere Prozesse USR1? (Ich weiß, es ist nicht dazu gedacht, hier besprochen zu werden, aber vielleicht werde ich dies an der richtigen Stelle ans Licht bringen)BASH_ENV
wie in dieser Antwort angegeben? Oder kennen Sie eine Standardmethode, um dieses Böse auszuschalten?