Вернитесь к исходной команде, когда вы сделали несколько изменений в строке:
revert-line (M-r)
Undo all changes made to this line. This is like
executing the undo command enough times to get back to the beginning.
M
это мета ключ, который altrдля меня.
Бесплатная, но полезная информация
Когда вы уже выполнены команда , как OP было сделаны ранее (это бывает), нет ничего , чтобы «отменить» , поскольку команды обрабатываются и запоминаются GNU Readline библиотеки и не написанные$HISTFILE
до выходов оболочки. Причина , почему я говорю об этом, потому что вы не можете просто , как можно было бы ожидать , и это не может быть идеальным для выхода из оболочки.grep
$HISTFILE
Итак, вот несколько вариантов, чтобы уберечь вас от прокрутки всех предыдущих команд readline.
Если вы помните какую-либо команду , нажмите ctrl+ rи введите то, что вы помните, чтобы найти предыдущие команды, содержащие эту строку. Повторное нажатие ctrl+ rпокажет следующий самый последний поиск в обратном направлении.
Например, введите ls -l
затем ctrl+ rстолько раз, сколько потребуется , чтобы найти предыдущую команду , которую вы ищете. Если вы прокрутите мимо него, ctrl+ sбудет искать вперед с текущей позиции.
fc
Баш встроенной команды полезен для отображения номера индексов наряду с предыдущими командами чтения строки.
fc -l -100
перечислит предыдущие 100 команд в readline.
Кроме того, если OP знает, что он ищет предыдущую ls -l
команду, он может передать вывод, grep
например: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.
ksh
, например, вы можете редактировать записи истории и ссылаться на них , не удаляя «предыдущую версию» записи; у вас есть все вызванные команды доступны.