Это «не работает», потому что каждая команда вводится в историю по умолчанию, как указывал @suspectus.
Однако вы можете указать Bash удалить дубликаты, установив переменную Bash HISTCONTROL
. (Документация: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables). Это разделенный двоеточиями список из нуля или более ключевых слов, который вы, скорее всего, заинтересованы в том, чтобы быть erasedups
. Обратите внимание, что затрагивается только история, введенная в текущих сеансах . Установка HISTCONTROL=erasedups
не вернется и не удалит дубликаты из ваших предыдущих сессий (но посмотрите другое решение ниже). Также обратите внимание, что HISTCONTROL
является переменной Bash и не нуждается в экспорте.
Для чего это стоит, мои настройки:
HISTCONTROL=ignoreboth:erasedups
HISTIGNORE="?:??:???:$HISTIGNORE"
HISTSIZE=5000
Я начал использовать эти настройки, потому что меня раздражали многие тривиальные и повторяющиеся команды, выталкивающие тщательно созданные команды «из списка». Параметр HISTIGNORE
игнорирует короткие команды. Я считаю, что набрать 'Up Arrow' для получения команды, подобной ls
, не намного короче, поэтому я предпочитаю вообще не хранить команды из одной-трех букв. Кроме того, все, что начинается с пробела, не будет сохранено в истории. Я использую это для одноразовых команд.
Обратите внимание, что дубликаты могут все еще накапливаться, если у вас есть несколько открытых сеансов одновременно. Время от времени я удаляю дубликаты из файла истории со следующими однострочниками:
tac ~/.bash_history | awk '!seen[$0]++' | tac > .tmp.newhist && mv .tmp.newhist ~/.bash_history