Ich benutze mehrere Konsole-Terminals. Und ich möchte, dass alle Befehle, die ich in jedes Terminal eingebe, im Befehlsverlauf gespeichert werden, damit die nächste Konsole, die ich öffne, alle enthält. Um zu verhindern, dass jedes Terminal den Befehlsverlauf des anderen Terminals überschreibt, habe ich die folgenden Einstellungen vorgenommen.bashrc
# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1
Ich habe die letzte Zeile angegeben, um die Befehlsnummer in meiner Eingabeaufforderung anzuzeigen. Der Befehl Nr. ist nie über 600 gegangen, aber immer noch verschwinden einige meiner alten Befehle aus der Geschichte. Es gibt viele Befehle, die wiederholt gegeben werden, aber wie erwartet ignoredups
wird der Befehl no in prompt nie erhöht. Dennoch verschwinden alte Befehle immer noch. Und die Anzahl der Befehle in der Geschichte bleibt immer etwas mehr als 500.
Die .bash_history
Datei enthält trotz ignorierter Ups immer noch viele Duplikate.
PS: Die Ausgabe von Echo $HISTSIZE
und $HISTFILESIZE
sind beide=1000
Update: Ich habe das Problem im obigen Eintrag zu gefunden .bashrc
. Aufruf nur history -a
in PROMPT_COMMAND
einfach den letzten neuen Befehl an der .bash_history anhängt. Also die ignoredups
und erasedups
haben keine Wirkung.
Kann ich trotzdem ohne Duplikate von jedem Terminal in die .bash_history schreiben? Ich möchte nicht den gesamten Verlauf an jeder Eingabeaufforderung von laden history -r
und mit erneut schreiben history -w
, da die Befehle, die ich in einem Terminal ausgegeben habe, auch in einem anderen parallel laufenden Terminal angezeigt werden . Ich möchte, dass die kombinierten Befehle nur in einem neuen Terminal angezeigt werden.
Das Rätsel, warum meine Geschichte auf 500 gekürzt wurde, ist gelöst. Ich bemerkte, dass es jedes Mal passierte, wenn ich in diese Maschine ssh. Das Erstellen eines .bash_profile
mit dem folgenden Eintrag löste dieses Problem.
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
Jetzt wird meine .bashrc jedes Mal ausgeführt, wenn ich auch ssh. Und die Größe der Verlaufsdatei nimmt jetzt monoton zu.
quelle
bug-bash
ein Jahr nach dem PostenAntworten:
Ich bin zu dem Schluss gekommen, dass es nicht möglich ist, die neuen Befehle direkt anzuhängen und gleichzeitig Duplikate zu entfernen. Meine Lösung besteht also darin, die folgenden Befehle in einer Weile auszuführen. oder um es in meine crontab zu legen.
Der obige Befehl behält das letzte Auftreten eines Befehls bei und entfernt alle anderen darüber liegenden Wiederholungen aus der Verlaufsdatei, ohne die Reihenfolge zu verfälschen.
quelle
Es ist hässlich und ich bin mir sicher, dass
sed
oderawk
wäre es besser, aber ich habe versucht, das gleiche Problem zu beheben, indem ich dies in mein.bashrc
:Dadurch wird für jedes Terminal, das Sie öffnen, eine separate Verlaufsdatei erstellt. Wenn Sie jedoch bash innerhalb von bash ausführen, wird derselbe Verlauf verwendet, der jedoch nicht überschrieben werden sollte. Ich werde Sie mit einer Einschränkung aus meiner Erfahrung warnen. Während dies funktioniert und verhindert, dass der Verlauf überschrieben wird, müssen Sie
grep
mehrere Dateien verwenden, um den gewünschten Verlauf zu finden, was manchmal zeitaufwändig sein kann.quelle