В системах 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
источник
ksh
, например, вы можете редактировать записи истории и ссылаться на них , не удаляя «предыдущую версию» записи; у вас есть все вызванные команды доступны.ksh
поведение здесь отличается. И ваши параметры редактирования истории также зависят от выбранного режима редактирования. Вksh
«ы ви-режиме, например, старая запись не перезаписывается, и я также может выдать команду отмены, как вvi
, с„и“.ksh
, но приятно знать, что такая вещь существует там.Ответы:
Если вы отредактировали запись истории, но еще не нажали Enter, чтобы вернуться к исходной записи, несколько раз нажмите Ctrl+ _-
undo
команду - до тех пор, пока она не внесет никаких изменений. Вы вернулись к исходной записи.источник
Вернитесь к исходной команде, когда вы сделали несколько изменений в строке:
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
разделе показано, как вы можете легко редактировать строку из последней использованной команды.Пример:
Самые последние команды теперь будут отображать:
Приведенный выше пример также объясняет, как использовать
sed
для замены строки в указателе события.Так что если в истории есть 3 команды,
echo foo
то вы должны использовать:!-3:s/foo/bar
Обратите внимание, что в этом случае указатели событий появятся в вашей истории как выполненная команда
echo bar
. Это не появится в истории как!-3:s/foo/bar
.Просто добавьте это, поскольку это кажется тесно связанным, даже если это больше «не делай», чем «отменить» решение, которое ищет OP.
источник