Ответ 1
Насколько я знаю, невозможно делать то, что вы хотите. Я вижу это как ошибку в обработке истории bash, которая может быть улучшена.
export HISTCONTROL=ignoreboth:erasedups # no duplicate entries
shopt -s histappend # append history file
export PROMPT_COMMAND="history -a" # update histfile after every command
Это сохранит историю в памяти уникально, но при сохранении истории из нескольких сеансов в один и тот же файл она не сохранит историю в самом файле. history -a
будет записывать новую команду в файл, если она не будет такой же, как и непосредственно перед этим. Он не будет делать полное дедупликацию, как в erasedups
, в памяти.
Чтобы увидеть эту глупость в действии, запустите новую сессию терминала, просмотрите историю, и вы увидите повторяющиеся записи, например ls
. Теперь запустите команду ls
, и все дублированные ls
будут удалены из истории в памяти, оставив только последнюю. История памяти становится короче, поскольку вы запускаете команды, которые дублируются в файле истории, но сам файл истории продолжает расти.
Я использую свой собственный script для очистки файла истории по запросу.
# 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
}
Мне бы хотелось услышать более элегантные способы сделать это.
Примечание. script не будет работать, если вы включите отметку времени в истории через HISTTIMEFORMAT.
Bash может улучшить ситуацию на
- fix
history -a
только для записи новых данных, если он не соответствует истории в памяти, а не только последней. - де-дедуплицировать историю при чтении файлов, если установлено значение
erasedups
. Простойhistory -w
в новом терминале затем очистит файл истории, а не глупый script выше.