Soweit ich weiß, ist es nicht möglich ist, zu tun, was Sie wollen. Ich sehe das als einen Fehler in der Geschichte Verarbeitung von bash, die verbessert werden könnte.
export HISTCONTROL=ignoreboth:erasedups # no duplicate entries
shopt -s histappend # append history file
export PROMPT_COMMAND="history -a" # update histfile after every command
Dies wird die in Erinnerung Geschichte einzigartig halten, aber während es Geschichte tut spart aus mehreren Sitzungen in der gleichen Datei, halten sie nicht die Geschichte in der Datei selbst einzigartig. history -a
schreibt den neuen Befehl in die Datei, es sei denn, es ist derselbe wie der unmittelbar davor. Es wird nicht eine vollständige Deduplizierung wie die erasedups
Einstellung im Speicher tun.
Um diese Dummheit in Aktion zu sehen, starten Sie eine neue Terminalsitzung, untersuchen Sie den Verlauf, und Sie werden wiederholt Einträge sehen, sagen ls
. Führen Sie jetzt den Befehl ls
aus, und alle duplizierten ls
werden aus dem Verlauf im Speicher gelöscht, wobei nur der letzte zurückbleibt. Der In-Memory-Verlauf wird kürzer, wenn Sie Befehle ausführen, die in der History-Datei dupliziert sind, aber die History-Datei selbst wächst weiter.
Ich benutze mein eigenes Skript, um die Verlaufsdatei bei Bedarf zu bereinigen.
# remove duplicates while preserving input order
function dedup {
awk '! x[$0]++' [email protected]
}
# removes $HISTIGNORE commands from input
function remove_histignore {
if [ -n "$HISTIGNORE" ]; then
# replace : with |, then * with .*
local IGNORE_PAT=`echo "$HISTIGNORE" | sed s/\:/\|/g | sed s/\*/\.\*/g`
# negated grep removes matches
grep -vx "$IGNORE_PAT" [email protected]
else
cat [email protected]
fi
}
# clean up the history file by remove duplicates and commands matching
# $HISTIGNORE entries
function history_cleanup {
local HISTFILE_SRC=~/.bash_history
local HISTFILE_DST=/tmp/.$USER.bash_history.clean
if [ -f $HISTFILE_SRC ]; then
\cp $HISTFILE_SRC $HISTFILE_SRC.backup
dedup $HISTFILE_SRC | remove_histignore >| $HISTFILE_DST
\mv $HISTFILE_DST $HISTFILE_SRC
chmod go-r $HISTFILE_SRC
history -c
history -r
fi
}
Ich würde gerne elegantere Möglichkeiten, dies zu tun hören.
Hinweis: Das Skript funktioniert nicht, wenn Sie den Zeitstempel im Verlauf über HISTTIMEFORMAT aktivieren. in Erinnerung, nicht nur die letzten
Bash kann die Situation von
- fix
history -a
nur neue Daten schreiben verbessern, wenn es keine Geschichte übereinstimmt.
- deduplizieren Geschichte, wenn Dateien gelesen werden, wenn
erasedups
Einstellung festgelegt ist. Ein einfacher history -w
in einem neuen Terminal würde dann die Verlaufsdatei anstelle des obigen dummen Skripts bereinigen.
Haben Sie das jemals gelöst? Mein/etc/profile sieht so aus (auf einem Mac) und ich habe das gleiche Problem: # http://blog.macromates.com/2008/working-with-history-in-bash/ # http: //www.ducea.com/2006/05/15/linux-tips-take-control-of-your-bash_history/ Export HISTCONTROL = erasedups Export HISTSIZE = 10000 Export HISTTIMEFORMAT = "% F% T% t“ shopt es histappend (Den Versuch, diese Hälfte anständig zu formatieren, nicht leicht) – joedevon
diese Frage Siehe http://unix.stackexchange.com/questions/48713/how-can-i-remove-duplicates -in-my-bash-history-erhaltende Reihenfolge – Nathan
Dies ist ein inhärentes Problem in der Programmierung und bezieht sich auf spezifische Werkzeuge, die Programmierer verwenden. Ich bin verwirrt, dass diese Frage als "off-topic" (viel mehr von mindestens 5 Personen) betrachtet werden würde. Eine redundante .bash_history ist für mich seit langem ein Ärgernis, jetzt gelöst. Diese Frage konnte jedoch auf die Unix-Stackexchange-Site verschoben werden. –