Отключить повторяющиеся элементы в истории 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
каталог.