Как избежать повторяющихся записей в .bash_history

109

Одна и та же команда снова и снова появляется в моей истории. Как я могу избежать этого? Я знаю, что это возможно через, HISTCONTROLно я не нашел правильный путь.

karthick87
источник
Я создал связанный вопрос: askubuntu.com/questions/205520/… . Dups в истории полезно видеть контекст команды. То, что вы хотите пропустить иногда, когда вы печатаете историю.
Джастингордон

Ответы:

123

Со bashстраницы руководства :

HISTCONTROL

Список значений, разделенных двоеточиями, управляющий тем, как команды сохраняются в списке истории. Если список значений включает в себя ignorespace, строки, начинающиеся с пробела, не сохраняются в списке истории. Значение ignoredupsприводит к тому, что строки, соответствующие предыдущей записи истории, не будут сохранены. Значение ignorebothявляется сокращением для ignorespace и ignoredups. Значениеerasedupsвызывает удаление всех предыдущих строк, соответствующих текущей строке, из списка истории перед сохранением этой строки. Любое значение, отсутствующее в приведенном выше списке, игнорируется. Если HISTCONTROL не установлен или не содержит допустимого значения, все строки, прочитанные синтаксическим анализатором оболочки, сохраняются в списке истории при условии значения HISTIGNORE. Вторая и последующие строки многострочной составной команды не тестируются и добавляются в историю независимо от значения HISTCONTROL.

Поэтому добавьте следующую строку в ваш ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups

Исайя
источник
Вы хотите, чтобы я добавил HISTCONTROL = ignoreboth внизу ~ / .bashrc?
karthick87
1
@ karthick Неважно, где вы положили, но все равно хорошо.
Исаия
На моей установке Ubuntu 12.04 я должен был сделать эту модификацию в ~/.bash_loginбольшинстве случаев, она работала бы, если бы был изменен .bashrc, но это не всегда так .
ck-
3
Не забудьте запустить их после обновления вашего профиля bash / rc-файлов -source ~/.bashrc && source ~/.bash_profile
Eric Kigathi
23

Вставьте это в свой ~/.bashrc:

export HISTCONTROL=ignoredups

Вы могли бы вместо этого использовать ignoreboth. Это сокращенное обозначение ignorespaces(команды, начинающиеся с пробелов) и ignoredups(дубликаты).

Я предпочитаю сам ignoredupsпо себе, так как я считаю, что поведение по умолчанию игнорирования команд с пробелами в начале довольно раздражает, когда я копирую команду с веб-сайта, и она не сохраняется, потому что я тоже случайно скопировал в пробел .... каждый свой.

Оли
источник
3
Все еще существуют дубликаты .. В чем может быть проблема? imgur.com/fXeLQ.png
karthick87
5
@ karthick87, цитата из другого ответа: значение ignoredupsприводит к тому, что строки, соответствующие предыдущей записи в истории, не будут сохранены . Он удаляет только последовательные идентичные строки.
AL
10

Установка этого параметра ~/.bashrcприведет к тому, что решение @ alvin будет применено к разным сеансам.

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

Источник: Linux: Bash history: настройки ignoredups и erasedups конфликтуют с общей историей между сеансами

Нур Волк
источник
Почему он использует, export HISTCONTROLа ваш нет? Какая разница? Это работает для меня без экспорта, мне просто любопытно
felwithe
1
Хороший вопрос! Я также хотел бы знать ответ. В общем случае exportделает переменную доступной для подпроцессов. stackoverflow.com/q/1158091/552621 В случае HISTCONTROL, PROMPT_COMMANDи так далее, эти переменные используются самой оболочкой, поэтому, возможно, их экспорт (в дочерние процессы) не требуется.
Nour Wolf
3

Добавьте следующее к вашему ~/.bashrc:

export HISTCONTROL=ignoredups

Для этого вы можете использовать эту команду:

nano ~/.bashrc
JRG
источник
0

Для уникальной записи каждой новой команды сложно. Сначала вы должны добавить ~/.profileили аналогичный:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Затем вам нужно добавить в ~/.bash_logout:

history -a
history -w
Стивен Пенни
источник