So vermeiden Sie doppelte Einträge in .bash_history


108

Der gleiche Befehl wird immer wieder in meiner Historie aufgeführt. Wie kann ich das vermeiden? Ich weiß, dass es über möglich ist, HISTCONTROLaber ich habe nicht den richtigen Weg gefunden.


Ich habe eine verwandte Frage erstellt: askubuntu.com/questions/205520/… . Dups im Verlauf sind nützlich, um den Kontext eines Befehls anzuzeigen. Was möchten Sie manchmal Dups weglassen, wenn Sie den Verlauf drucken.
Justingordon

Antworten:


123

Von der bashManpage:

HISTCONTROL

Eine durch Doppelpunkte getrennte Liste von Werten, die steuern, wie Befehle in der Verlaufsliste gespeichert werden. Wenn die Liste der Werte enthält ignorespace, werden Zeilen, die mit einem Leerzeichen beginnen, nicht in der Verlaufsliste gespeichert. Ein Wert von ignoredupsbewirkt, dass Zeilen, die mit dem vorherigen Verlaufseintrag übereinstimmen, nicht gespeichert werden. Ein Wert von ignorebothist eine Abkürzung für ignorespace und ignoredups. Ein Wert vonerasedupsbewirkt, dass alle vorherigen Zeilen, die mit der aktuellen Zeile übereinstimmen, aus der Verlaufsliste entfernt werden, bevor diese Zeile gespeichert wird. Jeder Wert, der nicht in der obigen Liste enthalten ist, wird ignoriert. Wenn HISTCONTROL nicht gesetzt ist oder keinen gültigen Wert enthält, werden alle vom Shell-Parser gelesenen Zeilen in der Verlaufsliste gespeichert, vorbehaltlich des Werts von HISTIGNORE. Die zweite und die folgenden Zeilen eines mehrzeiligen zusammengesetzten Befehls werden nicht getestet und unabhängig vom Wert von HISTCONTROL zum Verlauf hinzugefügt.

Fügen Sie also die folgende Zeile ein ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups


Soll ich HISTCONTROL = ignoreboth am Ende von ~ / .bashrc einfügen?
karthick87

1
@ karthick Es ist egal, wo du es hinstellst, der Boden ist aber in Ordnung.
Jesaja,

Bei meiner Installation von Ubuntu 12.04 hatte ich in diese Änderung machen Die ~/.bash_loginmeisten der Zeit es funktionieren würde , wenn Bashrc geändert wird , aber das ist nicht der Fall all die Zeit.
ck-

3
Vergessen Sie nicht, diese auszuführen, nachdem Sie Ihr Bash-Profil / Ihre source ~/.bashrc && source ~/.bash_profile
RC-

23

Stecke dies in dein ~/.bashrc:

export HISTCONTROL=ignoredups

Sie könnten stattdessen verwenden ignoreboth. Dies ist eine Abkürzung für ignorespaces(Befehle, die mit Leerzeichen beginnen) und ignoredups(Duplikate).

Ich bevorzuge es ignoredupsalleine, da ich das Standardverhalten, Befehle mit Leerzeichen an der Vorderseite zu ignorieren, ziemlich ärgerlich finde, wenn ich einen Befehl von einer Website kopiere und er nicht gespeichert wird, weil ich ihn versehentlich auch in ein Leerzeichen kopiert habe jeder seine eigenen.


3
Es sind noch Duplikate vorhanden. Woran kann das liegen? imgur.com/fXeLQ.png
karthick87

5
@ karthick87 zitiert aus einer anderen Antwort: Ein Wert von ignoredupsbewirkt, dass Zeilen, die mit dem vorherigen Verlaufseintrag übereinstimmen, nicht gespeichert werden . Es werden nur aufeinanderfolgende identische Zeilen entfernt.
AL

10

Wenn Sie dies ~/.bashrceingeben, wird die @ alvin-Lösung in verschiedenen Sitzungen als wlell angewendet

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

Quelle: Linux: Bash-Verlauf: Das Setzen von "Ignoredups" und "Erasedups" widerspricht dem gemeinsamen Verlauf über mehrere Sitzungen hinweg


Warum benutzt er export HISTCONTROLund deiner nicht? Was ist der Unterschied? Es funktioniert für mich ohne Export, ich bin nur neugierig
felwithe

1
Gute Frage! Ich würde auch gerne die Antwort wissen. exportStellt die Variable im Allgemeinen Teilprozessen zur Verfügung. stackoverflow.com/q/1158091/552621 Im Falle HISTCONTROL, PROMPT_COMMANDusw., werden diese Variablen durch die Shell verwendet selbst so vielleicht sie exportieren (für Kinder verarbeitet) ist nicht erforderlich.
Nour Wolf


3

Fügen Sie Folgendes zu Ihrem hinzu ~/.bashrc:

export HISTCONTROL=ignoredups

Dazu können Sie diesen Befehl verwenden:

nano ~/.bashrc

0

Es ist schwierig, jeden neuen Befehl eindeutig aufzuzeichnen. Zuerst müssen Sie hinzufügen ~/.profileoder ähnlich:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Dann müssen Sie hinzufügen ~/.bash_logout:

history -a
history -w
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.