Как отменить изменения в истории команд?

В системах UNIX вы можете нажимать верхнюю и нижнюю стрелки для навигации по предыдущим командам. Это очень удобно.

Иногда я поднимаюсь и нахожу команду, которую я хочу использовать снова, но с некоторыми вариантами. Если я сделаю такие изменения, то у меня нет способа вернуть исходную команду, если я не проверю ее в history .

Есть ли способ «отменить» изменения в команде в истории, доступ к которой осуществляется через ключи?

Мое текущее обходное решение – добавить команду # в команду. Таким образом, текущая команда выполняется как комментарий, поэтому ничего не происходит. Затем я могу снова просмотреть команды с помощью клавиш. Проблема в том, что команда, которую я использовал, может быть очень далекой в ​​списке, поэтому повторное повторение в двести раз немного. Control + R тоже не является решением, так как я не помню точно, что я искал.

пример

Я набрал следующие «50 команд назад»:

 ls -l /etc/httpd/conf/ 

Теперь я подошел к этой линии и изменил ее на

 ls -l /etc/init.d/ 

но не нажал кнопку ввода. Теперь я хочу перейти к ls -l /etc/httpd/conf/ снова.

Моя среда

 $ echo $SHELL /bin/bash $ echo $TERM xterm 

3 Solutions collect form web for “Как отменить изменения в истории команд?”

Пока вы редактируете запись истории, но еще не нажимаете Enter , чтобы вернуться к исходной записи, несколько раз нажмите Ctrl + _ – команду undo пока она не изменит никаких изменений. Вы вернулись к первоначальной записи.

Вернитесь к исходной команде, если вы внесли несколько изменений в строку:

 revert-line (Mr) Undo all changes made to this line. This is like executing the undo command enough times to get back to the beginning. 

M – это мета-ключ, который для меня характерен.


Безвозмездно, но полезная информация

Когда вы выполнили ранее выполненную команду OP (это происходит), нет ничего, что можно было бы отменить, потому что команды обрабатываются и запоминаются библиотекой GNU Readline и не записываются в $HISTFILE пока оболочка не выйдет. Причина, по которой я упоминаю об этом, заключается в том, что вы не можете просто grep $HISTFILE как можно было бы ожидать, и это может быть не идеальным для выхода из оболочки.

Итак, вот несколько вариантов, чтобы спасти вас от прокрутки всех предыдущих команд readline.

Если вы помните какую-то команду , нажмите ctrl + r и введите то, что вы помните, для поиска по предыдущим командам, содержащим эту строку. Повторное нажатие ctrl + r отобразит следующий последний, поиск назад.

Например, введите ls -l ctrl + r столько раз, сколько требуется, чтобы найти предыдущую команду, которую вы ищете. Если вы прокрутите его, ctrl + s будет искать вперед от текущей позиции.

Команда fc bash builtin помогает перечислить номера индексов вместе с предыдущими командами readline.

fc -l -100 будет отображать предыдущие 100 команд в readline.

Кроме того, если OP знает, что он ищет предыдущую команду ls -l , он может передать вывод в grep например: fc -l -100 | grep 'ls -l' fc -l -100 | grep 'ls -l'

Это должно выводить список предыдущих команд ls -l предшествует номер индекса. Результат выглядит следующим образом:
2065 ls -l

Теперь вы можете использовать обозначение события !n где n – номер индекса. В этом примере выполнение !2065 будет расширяться до ls -l .


Хотя это не помогает после того, что любой, кто хочет сохранить недавнюю историю команд при изменении предыдущих команд, должен увидеть раздел HISTORY EXPANSION man bash . Вот несколько альтернативных методов для изменения старых команд без перезаписи истории.

В разделе « Event Designators » показано, как вы можете легко редактировать строку из последней используемой команды.

 ^string1^string2^ Quick substitution. Repeat the previous command, replacing string1 with string2. Equivalent to ``!!:s/string1/string2/'' (see Modifiers below). 

Пример:

 $ echo foo foo $ ^foo^bar echo bar bar 

Теперь будут показаны самые последние команды:

 echo foo echo bar 

В приведенном выше примере также объясняется, как использовать sed для замены строки в обозначении события.

 !-n Refer to the current command minus n. 

Итак, если 3 команды в истории – echo foo вы будете использовать:
!-3:s/foo/bar

Обратите внимание, что в вашей истории в качестве команды будут отображаться указатели событий, в этом случае echo bar . Он не появится в истории как !-3:s/foo/bar .

Просто бросая это, поскольку это кажется тесно связанным, даже если это больше «не делать», чем «отменить» решение OP ищет.

При использовании bash просто отредактируйте файл .bash_history в своем домашнем каталоге

  • Каковы разделители слов readline?
  • Возвращаясь к команде, я частично написал
  • inputrc неправильно загружается
  • Alt-Left для пропуска слов не работает в эмуляторах терминалов
  • Readline .inputrc сбрасывает значения по умолчанию с каждой строкой
  • Как переключиться в режим редактирования vi в readline?
  • bash show-all-if-twoiguous включается спонтанно
  • привязка ключа режима vi только в обычном режиме
  • Входы ввода-вывода GNU readline vi-insert отображаются, похоже, не действуют
  • тайм-аут вызывает, когда цикл чтения заканчивается, когда `cat` отключен
  • Использование команды чтения оболочки с функциями редактирования в реальном времени (например, чтение)
  • запутанное поведение клавиш в стиле emacs в bash
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.