Das Speichern des Bash-Verlaufs von mehreren Konsolen funktioniert nicht ordnungsgemäß

9

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 ignoredupswird 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_historyDatei enthält trotz ignorierter Ups immer noch viele Duplikate.

PS: Die Ausgabe von Echo $HISTSIZEund $HISTFILESIZEsind beide=1000


Update: Ich habe das Problem im obigen Eintrag zu gefunden .bashrc. Aufruf nur history -ain PROMPT_COMMANDeinfach den letzten neuen Befehl an der .bash_history anhängt. Also die ignoredupsund erasedupshaben 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 -rund 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_profilemit 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.

Indiajoe
quelle
Ist es das, wonach du suchst? unix.stackexchange.com/questions/1288/…
Jasonwryan
Nein, ich möchte die zweite Anforderung in Olis Liste vermeiden. Ich möchte nicht, dass die Geschichte meines verschiedenen Terminals verwechselt wird. Bis ich ein neues Terminal starte. Dies ist natürlich der Fall, wenn ich meine Maschine ordnungsgemäß herunterfahre. Aber manchmal ist ein ordnungsgemäßes Herunterfahren nicht möglich, und wenn ich den Verlauf nicht sofort speichere, geht bei einem plötzlichen Ausschalten alles verloren.
Indien
Klingt ziemlich ähnlich wie die Frage, die bug-bashein Jahr nach dem Posten
syntaxerror

Antworten:

1

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.

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

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.

Indiajoe
quelle
0

Es ist hässlich und ich bin mir sicher, dass sedoder awkwäre es besser, aber ich habe versucht, das gleiche Problem zu beheben, indem ich dies in mein .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

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 grepmehrere Dateien verwenden, um den gewünschten Verlauf zu finden, was manchmal zeitaufwändig sein kann.

Umeboshi
quelle