Редактирование истории в bash

В bash, когда я вернусь в историю, отредактируйте некоторую команду и запустите ее, эта отредактированная команда добавляется в историю, а исходная остается без изменений. Но время от времени я каким-то образом влияю на исходную команду, то есть мое редактирование заменяет исходную команду в истории. Я не могу сказать, как это происходит. Может кто-нибудь объяснить? Моя цель - избежать этого, поэтому любое редактирование предыдущей команды всегда добавляется к истории и никогда не заменяет оригинал.

Ответ 1

Вот мой собственный ответ, пожалуйста, исправьте или укажите более подробную информацию, если сможете.

Если параметр "vi" установлен в bash ( "set -o vi" - "Использовать интерфейс редактирования командной строки в стиле vi" ), существует два режима редактирования команды из истории.

Первый режим (пусть его называют "базовым" ) - это когда вы сразу начинаете редактирование с помощью клавиш Backspace, Del и символов.

Другой режим - это "режим vi", который вводится при нажатии Esc.

Если вы хотите сохранить свою историю неповрежденной, НЕ используйте оба режима в одном и том же редактировании. Я не знаю, как работает bash, но вы можете думать об этом так:

  • Ввод "vi mode" применяет любые изменения, выполненные в "базовом режиме" к исходной команде, и создает копию команды, которую вы можете редактировать дальше, используя команды стиля vi.
  • Изменения применяются, когда вы нажимаете Enter (выполнить), Up, Down или j, k (переходите к другой команде в истории).
  • Изменения не применяются, если вы нажмете Ctrl-C.
  • Использование основного или видового редактирования ALONE не влияет на исходную команду в истории.

Ответ 2

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

Ответ 3

Что делать

echo $HISTCONTROL
echo $HISTIGNORE

дать вам?

Edit:

Я смог воспроизвести поведение, подобное тому, что вы видели, выполнив следующие шаги:

  • В командной строке введите:

    echo abcd
    echo efgh

  • Дважды нажмите стрелку вверх, чтобы отобразилось "echo abcd"

  • Нажмите 1, чтобы добавить символ в конце

  • Нажмите escape, чтобы войти в командный режим

  • Дважды нажмите стрелку влево, чтобы курсор находился на "c"

  • Нажмите x, чтобы удалить "c"

  • Нажмите enter

Теперь, когда вы возвращаетесь к истории, вы увидите новую запись в конце:

echo abd1

и запись, которая ранее имела "echo abcd", теперь будет выглядеть следующим образом:

echo abcd1

Это один из способов, я уверен, что есть и другие.