5

Дубликаты уже отключены, но этого недостаточно (я чувствую, что мне приходится слишком часто вводить команды).

Предположим, у меня есть 2000 записей о bash history и команда, которую я использовал очень часто (n раз) в прошлом, но не в последнее время, и я хочу использовать снова сейчас. Предположим, что эта команда находится на самой старой позиции в истории и будет удалена после выполнения следующей неповторяющейся команды. Я хотел бы, чтобы эта команда была сохранена, а самая старая команда (с количеством использований < n) была исключена из истории.

Можно утверждать, что это делает историю bash не (линейной) историей. Я согласен, но мне все равно, потому что я хочу легкий доступ к моим любимым командам (которые собираются автоматически).

Я использую bash 4.3.42 на Ubuntu 15.10.

1 ответ1

4

Предупреждение: это не ответ на вопрос в его нынешнем виде, а скорее предложение о подходе, который может оказаться полезным.

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

  1. мои настройки истории Bash:

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

    Это помогает сохранить записи, которые попадают в историю Bash. Команды типа ls короче набираемого, чем вызываемого , поэтому хранить их нет смысла (для этого и HISTIGNORE ). ignoreboth - это сокращение от ignorespace и ignoredups . Первое предотвращает попадание записей с ведущим пробелом в историю. Я использую его для команд, которые я знаю, что никогда не буду вспоминать или никогда не буду вспоминать, например, rm -rf * :). Есть еще много вещей, которые я игнорирую по умолчанию (не показано), что уменьшает размер истории.

  2. Несмотря на приведенные выше контрмеры, дубликаты все еще остаются в моей истории (например, из-за одновременного открытия нескольких оболочек Bash). У меня есть счетчик в моем приглашении, который показывает мне текущий размер истории

    PS1='\u@\h:\w:\!> '
    

    (Соответствующий код \! же номер истории этой команды .) Это показывает мне, когда пришло время «убирать» (см. Следующий шаг).

  3. Я периодически «очищаю» свою историю Bash, выполняя следующую команду:

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

(конечно, предполагается, что ваша история Bash хранится в ~/.bash_history ). Эта команда удаляет дубликаты при соблюдении порядка: последние использованные команды остаются последними. Сохраняется только последний (самый последний) дубликат.

Благодаря такому подходу я смог сохранить всю свою историю Bash в очень скромном размере от 600 до 1000 записей.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .