Одна и та же команда снова и снова появляется в моей истории. Как я могу избежать этого? Я знаю, что это возможно через, HISTCONTROL
но я не нашел правильный путь.
Одна и та же команда снова и снова появляется в моей истории. Как я могу избежать этого? Я знаю, что это возможно через, HISTCONTROL
но я не нашел правильный путь.
Ответы:
Со bash
страницы руководства :
HISTCONTROL
Список значений, разделенных двоеточиями, управляющий тем, как команды сохраняются в списке истории. Если список значений включает в себя
ignorespace
, строки, начинающиеся с пробела, не сохраняются в списке истории. Значениеignoredups
приводит к тому, что строки, соответствующие предыдущей записи истории, не будут сохранены. Значениеignoreboth
является сокращением дляignorespace
иignoredups
. Значениеerasedups
вызывает удаление всех предыдущих строк, соответствующих текущей строке, из списка истории перед сохранением этой строки. Любое значение, отсутствующее в приведенном выше списке, игнорируется. Если HISTCONTROL не установлен или не содержит допустимого значения, все строки, прочитанные синтаксическим анализатором оболочки, сохраняются в списке истории при условии значения HISTIGNORE. Вторая и последующие строки многострочной составной команды не тестируются и добавляются в историю независимо от значения HISTCONTROL.
Поэтому добавьте следующую строку в ваш ~/.bashrc
:
export HISTCONTROL=ignoreboth:erasedups
~/.bash_login
большинстве случаев, она работала бы, если бы был изменен .bashrc, но это не всегда так .
source ~/.bashrc && source ~/.bash_profile
Вставьте это в свой ~/.bashrc
:
export HISTCONTROL=ignoredups
Вы могли бы вместо этого использовать ignoreboth
. Это сокращенное обозначение ignorespaces
(команды, начинающиеся с пробелов) и ignoredups
(дубликаты).
Я предпочитаю сам ignoredups
по себе, так как я считаю, что поведение по умолчанию игнорирования команд с пробелами в начале довольно раздражает, когда я копирую команду с веб-сайта, и она не сохраняется, потому что я тоже случайно скопировал в пробел .... каждый свой.
ignoredups
приводит к тому, что строки, соответствующие предыдущей записи в истории, не будут сохранены . Он удаляет только последовательные идентичные строки.
Установка этого параметра ~/.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
а ваш нет? Какая разница? Это работает для меня без экспорта, мне просто любопытно
export
делает переменную доступной для подпроцессов. stackoverflow.com/q/1158091/552621 В случае HISTCONTROL
, PROMPT_COMMAND
и так далее, эти переменные используются самой оболочкой, поэтому, возможно, их экспорт (в дочерние процессы) не требуется.
export HISTCONTROL=erasedups
Для уникальной записи каждой новой команды сложно. Сначала вы должны добавить
~/.profile
или аналогичный:
HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'
Затем вам нужно добавить в ~/.bash_logout
:
history -a
history -w