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

808
Jonathon Reinhart

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

echo "Hello" 

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

echo "World" 

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

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

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

1
Он не сломан - каждая команда заносится в историю. suspectus 10 лет назад 0

4 ответа на вопрос

3
Steven Penny

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

HISTCONTROL=erasedups PROMPT_COMMAND='history -w' 

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

history -a history -w 
Пожалуйста, не размещайте один и тот же ответ на несколько вопросов. Если одна и та же информация действительно отвечает на оба вопроса, то один вопрос (обычно новый) следует закрыть как дубликат другого. Вы можете указать это, [проголосовав, чтобы закрыть его как дубликат] (https://superuser.com/help/privileges/close-questions) или, если у вас недостаточно репутации, [поднять флаг] ( https://superuser.com/help/privileges/flag-posts), чтобы указать, что это дубликат. В противном случае настройте свой ответ на этот вопрос, а не просто вставляйте один и тот же ответ в нескольких местах. DavidPostill 6 лет назад 0
1
periket2000

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

пример

Ctrl + R эхо

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

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

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

Ctrl + r World

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

Так просто.

1
Edward

Это «не работает», потому что каждая команда вводится в историю по умолчанию, как указывал @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Параметр игнорирует короткие команды. Я считаю, что набрать 'Стрелку вверх' для получения такой команды не намного короче ls, поэтому я предпочитаю вообще не хранить команды из одной-трех букв. Кроме того, все, что начинается с пробела, не будет сохранено в истории. Я использую это для одноразовых команд.

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

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

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

set -o vi 

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

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