Отключить повторяющиеся элементы в истории Bash

Bash в Fedora 19 действительно раздражает меня. Скажем, я запускаю команду:

echo "Hello"

Затем я запускаю другую команду:

echo "World"

Теперь я запускаю последнюю команду (echo "World") снова N раз, нажав up на моей клавиатуре с последующим вводом. (Типичное использование.)

Проблема в том, что каждый из этих echo "World" Команды вставляются в историю, даже если они идентичны. Я хочу просто нажать up дважды и доберитесь до echo "Hello", Вместо этого я должен нажать up N+1 раз.

Почему это сломано? Как мне это исправить?

4 ответа

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

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

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

history -a
history -w

Я не знаю, как решить эту проблему, но я дам вам альтернативу гораздо лучше. Сделайте это с помощью "Ctrl + r echo" и итерируйте свои напечатанные версии с помощью "Ctrl + r". Это быстрее, и когда вы получите хитрость, вам понравится.

пример

Ctrl + R эхо

Промо шоу: "Мир эха", если это не то, что вы хотите, нажмите еще раз Ctrl + r

Промо шоу: "эхо привет", если это не то, что вы хотите, нажмите Ctrl + r. Если это то, что вы хотите, просто нажмите Enter.

И вам не нужно начинать свое слово по порядку, вы можете сделать:

Ctrl + r World

и приглашение покажет "Мир эха", и вы можете нажать Enter, чтобы выполнить его.

Так просто.

Это "не работает", потому что каждая команда вводится в историю по умолчанию, как указывал @suspectus.

Однако вы можете указать Bash удалить дубликаты, установив переменную Bash. HISTCONTROL, (Документация: http://www.gnu.org/software/bash/manual/bashref.html). Это разделенный двоеточиями список из нуля или более ключевых слов, который вам, скорее всего, интересно erasedups, Обратите внимание, что затрагивается только история, введенная в текущих сеансах. настройка HISTCONTROL=erasedups Я не вернусь и не удаляю дубликаты из ваших предыдущих сеансов (но поищите другое решение ниже). Также обратите внимание, что HISTCONTROL является переменной Bash и не нуждается в экспорте.

Для чего это стоит, мои настройки:

HISTCONTROL=ignoreboth:erasedups
HISTIGNORE="?:??:???:$HISTIGNORE"
HISTSIZE=5000

Я начал использовать эти настройки, потому что меня раздражали многие тривиальные и повторяющиеся команды, выталкивающие тщательно созданные команды "из списка". HISTIGNORE настройка игнорирует короткие команды. Я считаю, что это не намного короче, чтобы набрать "Стрелка вверх", чтобы получить такую ​​команду, как ls, поэтому я предпочитаю не хранить от одной до трех букв. Кроме того, все, что начинается с пробела, не будет сохранено в истории. Я использую это для одноразовых команд.

Обратите внимание, что дубликаты могут по-прежнему накапливаться, если у вас открыто несколько сеансов одновременно. Время от времени я удаляю дубликаты из файла истории со следующими однострочниками:

tac ~/.bash_history | awk '!seen[$0]++' | tac > .tmp.newhist && mv .tmp.newhist ~/.bash_history

История Bash не может различить дублированные команды. Все команды записаны в истории. Один из способов быстро получить требуемую команду - это:

set -o vi

тип ESC, затем /helloдаст вам самую последнюю команду со строкой "привет". Используйте стрелку вверх, чтобы перечислить предыдущие команды, соответствующие строке "привет". Другие команды vi могут использоваться для получения / навигации по командам.

Если полезно set -o vi можно добавить в.bashrc в вашем HOME каталог.

Другие вопросы по тегам