В 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
Это один из способов, я уверен, что есть и другие.