Können Verlaufsdateien in Bash vereinheitlicht werden?

35

Ich führe routinemäßig mehrere screenSitzungen auf meinen Linux-Desktops und -Servern aus.

Ein Problem dabei ist, dass ich grepim Verlauf meines Befehls feststellen muss, dass ich einen Befehl in einer anderen Sitzung ausgegeben habe und mich trennen und erneut anfügen muss, um dieses Verlaufselement abzurufen.

Ist es möglich, die unterschiedlich aktualisierten Protokolle aus mehreren Sitzungen zu erzwingen, damit alle zu einem zentralen Protokoll wechseln?

Labyrinth
quelle
Ich bin auf ein ähnliches Problem gestoßen, bei dem ich den Verlauf zwischen den Terminalsitzungen nicht anzeigen konnte. Es stellte sich heraus, dass meine ~ / .bash_history-Datei im Besitz von root war und nicht beschreibbar. Der Wechsel des Besitzers / der Gruppe zu meinem Benutzer behebt das Problem: sudo chown <Benutzer>: <Gruppe> ~ / .bash_history
mateo

Antworten:

41

Es gibt zwei Dinge, die Sie tun müssen:

  1. Fügen Sie den Befehl shopt -s histappendin Ihren ein .bashrc. Dies wird an die Verlaufsdatei angehängt, anstatt sie zu überschreiben.
  2. Außerdem wird in your .bashrc, insert PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"und die Verlaufsdatei jedes Mal neu geschrieben und gelesen, wenn bash die Eingabeaufforderung anzeigt.

EDIT: Danke an e-t172 für den history -nTrick

innaM
quelle
6
Danke dafür. Ich habe es mit PROMPT_COMMAND = "$ PROMPT_COMMAND; history -a; history -n" weiter verbessert. Auf diese Weise werden Befehle, die in anderen Sitzungen ausgegeben wurden, sofort im Verlauf der aktuellen Sitzung angezeigt (Sie müssen also zuerst die Eingabetaste drücken, um den Verlauf zu aktualisieren).
Etienne Dechamps
8
Ich hatte vorher nicht PROMPT_COMMANDdefiniert, also musste ich verwenden PROMPT_COMMAND="history -a; history -n", um Fehler zu vermeiden.
William Jackson
1
In der Antwort von superuser.com/a/734410/250287 finden Sie die korrekten Verlaufsbefehle -a, -c und -r.
mtd
Nur eine Warnung für den Neuankömmling: Nachdem ich eine Zeit lang das Umschreiben der Geschichte verwendet hatte, wurde mir klar, dass ich häufig die falschen Befehle ausgab. Wenn Sie in der vorherigen Zeile einen Befehl sehen, erwarten Sie, dass der Aufwärtspfeil ihn wiederholt, und mit dieser Konfiguration ist dies nicht mehr immer der Fall.
Tiago
11

Bitte nicht verwenden history -a; history -n, es funktioniert nicht wie erwartet und es werden viele doppelte, nicht in der richtigen Reihenfolge befindliche Befehle in Ihrem Verlauf angezeigt. Eine Lösung, die im Allgemeinen wie erwartet funktioniert, ist die folgende:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

Die Verwendung einer Newline anstelle eines Semikolons ist auch eine kurze Möglichkeit, das Problem mit fehlenden / doppelten Semikolons mit PROMPT_COMMAND zu lösen.

Adam Crane
quelle
history -a, -c und dann -r ist richtig ... dies sollte die akzeptierte Antwort sein
mtd
1
Das exportist nicht nötig. Da interaktive Shell-Optionen festgelegt werden sollen, ~/.bashrcdie von jeder Sub-Shell aufgerufen werden, ist keine Vererbung erforderlich.
Dolmen
Gibt es einen guten Grund, PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"stattdessen nicht nur zu verwenden ?
Sechs
Für diese Reihenfolge müsste der letzte Exit-Wert gespeichert werden, bevor die Verlaufsbefehle ausgeführt werden, da viele Eingabeaufforderungsbefehle darauf angewiesen sind oder ihn anzeigen.
Adam Crane
-1

PROMPT_COMMAND ist in einigen Distributionen standardmäßig nicht definiert. Zum Beispiel ist es in Arch definiert, aber nicht in Debian.

Ich habe einen bashrc in meiner Dropbox, den ich beim Distributions-Hopping verwende. Er beinhaltet:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"
czayas
quelle
Eine schreckliche Lösung für ein grundlegendes Shell-Programmierproblem. Der richtige Weg:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
Dolmen
Besser:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
Dolmen