Як згадати попередню команду (без виконання), щоб змінити її?


14

Я не можу пригадати хитрість, де я міг отримати останню команду, не виконуючи її:

скажімо, я хочу мати доступ до команди! 1255, натискаючи клавішу зі стрілкою вгору та змінюючи команду. Отже, у чому полягає хитрість викликати команду, зробити її відображеною в командному рядку, але не виконаною та згодом доступною за допомогою клавіші зі стрілкою вгору?

Я намагався поставити відлуння, але потім у мене відлуння перед командою, я не пам'ятаю, як це зробити правильно.


4
якщо я правильно розумію ваш запит, можливо, просто спробуйте суфікс ": p" як в "! 1255: p"
Теофраст

@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("History 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. Будьте впевнені, що ви знаєте достатньо, щоб набрати достатньо однозначно потрібної команди
Michael Durrant

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, вказуючи список, а не виконувати (-l)

fc -ln -1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.