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=erasedups
geht nicht zurück und löscht Duplikate aus Ihren vorherigen Sitzungen (suchen Sie jedoch nach einer anderen Lösung). Beachten Sie auch, dass HISTCONTROL
es 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 HISTIGNORE
Einstellung ignoriert kurze Befehle. Ich finde, es ist nicht viel kürzer, 'Abwärtspfeil' ls
einzugeben, 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