Wiederholte Elemente in der Bash-Historie deaktivieren

895
Jonathon Reinhart

Bash in Fedora 19 nervt mich wirklich. Angenommen, ich führe einen Befehl aus:

echo "Hello" 

Dann führe ich einen anderen Befehl aus:

echo "World" 

Nun führe ich den letzten Befehl ( echo "World") nochmal N aus, indem upich auf meiner Tastatur drücke und dann die Eingabetaste drücke. (Typische Verwendung.)

Das Problem ist, dass jeder dieser echo "World"Befehle in die Historie eingefügt wird, obwohl sie identisch sind. Ich möchte einfach upzweimal drücken und komme zu echo "Hello". Stattdessen muss ich upN + 1-mal drücken .

Warum ist das kaputt? Wie kann ich das beheben?

1
Es ist nicht kaputt - jeder Befehl wird in die Historie eingetragen. suspectus vor 10 Jahren 0

4 Antworten auf die Frage

3
Steven Penny

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

HISTCONTROL=erasedups PROMPT_COMMAND='history -w' 

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

history -a history -w 
Bitte posten Sie nicht die gleiche Antwort auf mehrere Fragen. Wenn dieselben Informationen tatsächlich beide Fragen beantworten, sollte eine Frage (normalerweise die neuere) als Duplikat der anderen Frage geschlossen werden. Sie können dies angeben, indem Sie [Abstimmung, um es als Duplikat zu schließen] (https://superuser.com/help/privileges/close-questions) oder, falls Sie nicht genügend Ansehen dafür haben, [Flagge setzen] ( https://superuser.com/help/privileges/flag-posts), um anzugeben, dass es sich um ein Duplikat handelt. Ansonsten passen Sie Ihre Antwort auf diese Frage an und fügen Sie dieselbe Antwort nicht einfach an mehreren Stellen ein. DavidPostill vor 6 Jahren 0
1
periket2000

Ich weiß nicht, wie ich dieses Problem beheben kann, aber ich werde Ihnen eine Alternative geben, die weitaus besser ist. Machen Sie es mit "Strg + Echo" und durchlaufen Sie Ihre getippten Versionen mit "Strg + R". Es ist schneller und wenn Sie den Trick bekommen, werden Sie es lieben.

Beispiel

Strg + Echo

Die Promt-Show: "Echo World". Wenn Sie dies nicht wünschen, drücken Sie noch einmal Strg + R

Die Promt-Show: "Echo Hallo". Wenn Sie dies nicht wünschen, drücken Sie Strg + R. Wenn Sie dies wünschen, drücken Sie einfach die Eingabetaste.

Und Sie müssen Ihr Wort nicht in der richtigen Reihenfolge beginnen, Sie können Folgendes tun:

Strg + r Welt

In der Eingabeaufforderung wird "echo World" angezeigt, und Sie können die Eingabetaste drücken, um sie auszuführen.

So einfach.

1
Edward

Dies ist "defekt", da jeder Befehl standardmäßig in die Historie eingegeben wird, wie @suspectus darauf hingewiesen hat.

Sie können Bash jedoch anweisen, Duplikate zu löschen, indem Sie die Bash-Variable festlegen HISTCONTROL. (Dokumentation: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables ). Es ist eine durch Doppelpunkte getrennte Liste von null oder mehr Stichwörtern, an denen Sie höchstwahrscheinlich interessiert sind erasedups. Beachten Sie, dass nur der in den aktuellen Sitzungen eingegebene Verlauf betroffen ist. Die Einstellung HISTCONTROL=erasedupsgeht nicht zurück und löscht Duplikate aus Ihren vorherigen Sitzungen (suchen Sie jedoch nach einer anderen Lösung). Beachten Sie auch, dass HISTCONTROLes sich um eine Bash-Variable handelt, die nicht exportiert werden muss.

Meine Einstellungen sind:

HISTCONTROL=ignoreboth:erasedups HISTIGNORE="?:??:???:$HISTIGNORE" HISTSIZE=5000 

Ich fing an, diese Einstellungen zu verwenden, weil mich viele triviale und doppelte Befehle verärgerten, die sorgfältig gestaltete Befehle von der Liste wegschoben. Die HISTIGNOREEinstellung ignoriert kurze Befehle. Ich finde, es ist nicht viel kürzer, 'Abwärtspfeil' lseinzugeben, um einen Befehl abrufen zu können. Ich ziehe es vor, keine ein bis drei Buchstaben umfassenden Befehle zu speichern. Alles, das mit einem Leerzeichen beginnt, wird auch nicht im Verlauf gespeichert. Ich verwende das für Wegwerfbefehle.

Beachten Sie, dass sich weiterhin Duplikate ansammeln können, wenn Sie mehrere Sitzungen gleichzeitig geöffnet haben. Von Zeit zu Zeit entferne ich Duplikate mit dem folgenden Einzeiler aus der Verlaufsdatei:

tac ~/.bash_history | awk '!seen[$0]++' | tac > .tmp.newhist && mv .tmp.newhist ~/.bash_history 
0
suspectus

Die Bash-Historie kann doppelte Befehle nicht unterscheiden. Alle Befehle werden in der Historie aufgezeichnet. Eine Möglichkeit, um schnell zum gewünschten Befehl zu gelangen, ist:

set -o vi 

Typ ESC, dann /hello werden Sie den letzten Befehl mit der Zeichenfolge „Hallo“. Mit dem Aufwärtspfeil können Sie die vorherigen Befehle anzeigen, die der Zeichenfolge "Hallo" entsprechen. Andere vi-Befehle können zum Abrufen / Navigieren von Befehlen verwendet werden.

Wenn nützlich, set -o vikann .bashrc in Ihrem HOMEVerzeichnis hinzugefügt werden .