Как вызвать предыдущую команду (без выполнения), чтобы изменить ее?

14

Я не могу вспомнить уловку, где я мог получить последнюю команду без ее запуска:

скажем, я хочу иметь возможность получить доступ к команде! 1255 при нажатии клавиши со стрелкой вверх и изменить команду. Так в чем же хитрость, чтобы вызвать команду, сделать так, чтобы она отображалась в командной строке, но не выполнялась и впоследствии была доступна через клавишу со стрелкой вверх?

Я попытался поставить эхо, но затем перед командой у меня есть эхо, я не помню, как это сделать правильно.

Артурас М
источник
4
если я правильно понимаю ваш запрос, возможно, просто попробуйте суффикс ": p", как в "! 1255: p"
Theophrastus
@ Theophrastus Да, именно, я забыл об этом: p часть, и я не мог найти правильные ключевые слова в Google, чтобы найти это ... Спасибо, ребята.
Артурас М

Ответы:

21
!1255:p

Сделаю это

!является вызовом истории, печатается
1255номер строки,
:pно не выполняется

Затем вы можете использовать стрелку вверх, чтобы вернуть предыдущую (неисполненную) команду, и вы можете изменить ее, как вам нужно.

Я часто комбинирую это с hg(«History Grep») - моим любимым псевдонимом.

$ alias hg  # Maybe use hgr instead if you are a Mercurial CLI user.
alias hg='history | tail -200 | grep -i'

Этот поиск текста в недавней истории, независимо от регистра, используется следующим образом:

Когда я хочу найти последние команды vi для редактирования определенного файла, а затем хочу повторно использовать одну из них для редактирования того же файла, но с другим расширением файла.

$ hg variables
 6153  vi Variables/user-extensions.js 
 6176  vi Variables/user-extensions.js 
 6178  vi Variables/user-extensions.js 
 6190  vi Variables/user-extensions.js 
 6230  hg variables
$ # Notice the difference in case with V and v is ignored
$ !6190:p
vi Variables/user-extensions.js 
$ ["up-arrow"]
$ vi Variables/user-extensions.[now change .js to .html]

Я также определяю hga(«История Grep All») для поиска по всей моей истории:

$ alias hga
alias hga='history | grep -i'

но я не использую его много, потому что моя история (намеренно) очень большая, и я получаю слишком много выходных данных, которые позже влияют на прокрутку страниц в моем терминале.

Майкл Даррант
источник
2
Обратите внимание, что hgэто также CLI Mercurial .
usandfriends
1
Хорошая заметка. Добавлено в ответ.
Майкл Даррант
12

Нажатие Ctrl+ R(которое является привязкой ключа обратного инкрементального поиска в emacs, когда @gnp указывал в комментариях) в терминале позволяет вам искать в истории конкретную команду. Команда будет показана и может быть отредактирована перед выполнением. Вы увидите что-то вроде этого:

введите описание изображения здесь

Источник

Хамза Аббад
источник
1
Благодарность! Не совсем прямой ответ на мой вопрос, но я этого не знал и считаю его действительно полезным. Большое спасибо!
Артурас М
1
Также следует отметить, что Ctrl + R - это обратный инкрементальный поиск в emacs. Многие сочетания клавиш в emacs работают во многих инструментах GNU: Ctrl + A, Ctrl + E, Ctrl + K, Ctrl + Y и другие.
GnP
@gnp Спасибо за информацию, я этого не знал.
Хамза Аббад
Мне понадобилось много времени, чтобы освоиться с ctrl-r после изучения двух ключевых вещей. 1. игнорируйте вывод, когда вы печатаете. 2. Убедитесь, что вы знаете достаточно, чтобы набрать достаточно однозначно для нужной вам команды
Майкл Даррант
7

fcкоманда делает то , что вы хотите

fc -l <number> перечислит историю команд вокруг этого числа

fc <number>откроет эту запись командной строки vim(или, как я полагаю, ваш редактор по умолчанию), так что вы можете отредактировать ее, и :wqона будет доступна вам со стрелкой вверх.

подливка
источник
7

В bash Ctl+alt+eвыполняется расширение оболочки, поэтому при вводе !1255и нажатии этой комбинации текущая строка заменяется содержимым записи в истории. 1255

Адонис
источник
не сделал этого для меня на Ubuntu
Майкл Даррант
@MichaelDurrant, я только что попробовал 14.04 (kubuntu), и это работает для меня. Это задокументировано man bashкак shell-expand-line. Может быть, есть набор ярлыков для gnome-терминала.
Адонис
@adonis Я никогда не знал этого, большое спасибо, действительно, он делает то, что я просил тоже. И действительно, я могу найти больше применений этой функции. Потрясающие! Благодарность!
Артурас М
4

Вы хотите использовать команду fc при указании списка вместо execute (-l)

fc -ln -1
мяу
источник