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.
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.
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"
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.
Antworten:
Von der
bash
Manpage:Fügen Sie also die folgende Zeile ein
~/.bashrc
:export HISTCONTROL=ignoreboth:erasedups
quelle
~/.bash_login
meisten der Zeit es funktionieren würde , wenn Bashrc geändert wird , aber das ist nicht der Fall all die Zeit.source ~/.bashrc && source ~/.bash_profile
Stecke dies in dein
~/.bashrc
:Sie könnten stattdessen verwenden
ignoreboth
. Dies ist eine Abkürzung fürignorespaces
(Befehle, die mit Leerzeichen beginnen) undignoredups
(Duplikate).Ich bevorzuge es
ignoredups
alleine, 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.quelle
ignoredups
bewirkt, dass Zeilen, die mit dem vorherigen Verlaufseintrag übereinstimmen, nicht gespeichert werden . Es werden nur aufeinanderfolgende identische Zeilen entfernt.Wenn Sie dies
~/.bashrc
eingeben, wird die @ alvin-Lösung in verschiedenen Sitzungen als wlell angewendetQuelle: Linux: Bash-Verlauf: Das Setzen von "Ignoredups" und "Erasedups" widerspricht dem gemeinsamen Verlauf über mehrere Sitzungen hinweg
quelle
export HISTCONTROL
und deiner nicht? Was ist der Unterschied? Es funktioniert für mich ohne Export, ich bin nur neugierigexport
Stellt die Variable im Allgemeinen Teilprozessen zur Verfügung. stackoverflow.com/q/1158091/552621 Im FalleHISTCONTROL
,PROMPT_COMMAND
usw., werden diese Variablen durch die Shell verwendet selbst so vielleicht sie exportieren (für Kinder verarbeitet) ist nicht erforderlich.quelle
Fügen Sie Folgendes zu Ihrem hinzu
~/.bashrc
:Dazu können Sie diesen Befehl verwenden:
quelle
Es ist schwierig, jeden neuen Befehl eindeutig aufzuzeichnen. Zuerst müssen Sie hinzufügen
~/.profile
oder ähnlich:Dann müssen Sie hinzufügen
~/.bash_logout
:quelle