Автоматическая очистка истории Bash

Как можно автоматически очистить историю Bash? Например

  • Удалите обнаруженные опечатки из истории ( ls-lh не отображается, в which , поэтому он удален, я хотел набрать ls -lh )
  • Очистить избыточные пробелы cd / и cd / должны быть нормализованы, чтобы они были одинаковыми.

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

Надеюсь, мне не придется ждать, пока он не будет записан в файл, прежде чем запускать процедуру очистки. Это означало бы выход из строя до начала очистки. :(

я бы предпочел сохранить псевдоним всех распространенных ошибок, которые случаются

alias ls-lh = ls -lh

Используйте псевдоним, чтобы исправить недостающие опечатки:

alias cd..='cd ..

Используйте HISTIGNORE, чтобы указать все команды, которые вы хотите игнорировать из истории. используйте export HISTIGNORE="$LIST" чтобы указать, что вы хотите игнорировать внутри истории

Существует несколько других опций, которые контролируются встроенной командой «shopt».

см. здесь

Я не знаю, как настроить историю за пределами нескольких переменных HIST… Вы можете переключиться на zsh, что немного умнее (но немного). В zsh вы можете включить автокоррекцию команды ( setopt correct ), которая предложит исправление для некоторых опечаток на основе доступных имен команд (например, в моей системе она предлагает исправить sl в ls , но ничего не делает о ls-lh ). Дубликат Zsh более умный, поскольку он обнаруживает не последовательные дубликаты (в setopt hist_ignore_all_dups ). Zsh не выполняет никакой нормализации пробелов в истории, но система завершения немного умнее, чем bash, при условии, что количество пробелов согласуется с тем, вводите ли вы полное имя или нажмите Tab , что помогает.

Из этого блога этот скрипт может автоматически удалить все команды, которые не найдены bash.

Если у вас еще нет bash PROMPT_COMMAND , добавьте это в .bashrc :

 PROMPT_COMMAND="mypromptcommand" function mypromptcommand { } 

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

 local exit_status=$? # If the exit status was 127, the command was not found. Let's remove it from history local number=$(history | tail -n 1 | awk '{print $1}') if [ -n "$number" ]; then if [ $exit_status -eq 127 ] && ([ -z $HISTLASTENTRY ] || [ $HISTLASTENTRY -lt $number ]); then history -d $number else HISTLASTENTRY=$number fi fi 

Ссылка дает объяснение того, как она работает