Есть ли способ отменить изменение истории bash?

9

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

echo a
echo b
echo c
[up][up][backspace]d[ctrl+c]

история теперь показывает, что второй команды echo dне было echo b. Как мне сохранить первое echo bв истории?

Например, скажем, я выполняю очень длинную команду с большим количеством опций. затем я хочу запустить его снова, с небольшими изменениями, поэтому я возвращаюсь к истории, чтобы найти ее, внести изменения, но потом понимаю, что на самом деле мне не нужно повторно запускать ее, просто подумав о другом варианте делать вместо этого. потом, позже, я хочу вернуться и напомнить себе, какой командой я руководил - но подождите, история теперь показывает не то!

Это происходит очень редко, но когда это происходит, я нахожу это действительно раздражающим. Есть ли способ автоматически сохранить оригинальную историю?

Benubird
источник
1
с помощью historyвы можете увидеть все команды. После вы можете выбрать то, что вам нужно. Какую оболочку вы используете сейчас?
Хастур
6
Я не могу воспроизвести это. Если я изменяю c на d, нажимаю CTRL + C и снова нажимаю [вверх], он все равно говорит echo c.
Мартин фон Виттих

Ответы:

6

Попробуй положить в свой ~/.inputrc

 set revert-all-at-newline on

В некоторых случаях вы можете найти его в значении по умолчанию (Off).
Это должно вынудить readlineотменить все изменения в строках истории перед возвратом при accept-lineвыполнении. (больше информации в man bash).

Редактировать:
CTRL+c и set revert-all-at-newline onпрекрасно работает с тех пор bash-4.3.30.

# GNU bash, version 4.3.30(1)-release
# Emacs-mode

echo c
[up][backspace]d[Ctrl+c][up] # you should see echo c

Но:

echo c
[up][backspace]d[down][Ctrl+r]echo[Ctrl+j][Ctrl+c][up] # you should see echo d
Hastur
источник
Хорошо, это лучшее решение. Интересно, что CTRL-c фактически заставит его запомнить измененное значение, хотя полное стирание строки или стрелка вниз, а затем нажатие клавиши ввода или выполнение другой команды восстановит историю.
Дин Сереневы
@DeanSerenevy: Спасибо, мне тоже нравится ваш обходной путь, и я тоже начинаю использовать CTRL-a nano:-)
Hastur
4

Как правило:

CTRL-a # ENTER

сделаю это.

Исходная команда будет запомнена, если вы выполните измененную команду. Конечно, вы не хотите выполнять на самом деле, поэтому вы можете закомментировать строку с помощью #.

В вашем примере, вы бы тогда в истории: echo a, echo b, echo c, # echo d.

Декан сереневый
источник
1
Вы можете нажать, alt-shift-3чтобы закомментировать текущую командную строку, если ваш bash использует readline. /insert-commentв man 3 readline(или man bash) для получения дополнительной информации.
cychoi