поставити команду History в командний рядок, не виконуючи її


57

Я використовую! N де (n) - номер рядка для виконання рядка у файлі історії, який я хочу виконати в командному рядку, який я знаходжу через історію | менше.

Але є подія історії командного рядка, яку я хочу вручну змінити. Як я можу вставити в командний рядок вміст подій історії, але він фактично не виконує, щоб я міг змінити, а потім натиснути return?

Найкраще,

Відповіді:


71

Щоб вимагати, щоб команда була надрукована, а не виконувалася після підстановки історії, додайте :p модифікатор , наприклад !42:p. Отримана команда також буде введена в історію, тож ви можете натиснути її Upдля редагування.

Якщо у вас є histverify опція set ( shopt -s histverify), ви завжди матимете можливість редагувати результат заміни історії.

fcВбудований дає обмежений доступ до розкриттю історії (без слів десігнаторамі), а також дозволяє редагувати попередню команду в зовнішньому редакторі.

Ви можете використовувати !prefixдля позначення останньої команди, що починається з prefix, і !?substringдля останньої команди, що починається з substring. Коли ви знаєте, що шукаєте, це може заощадити багато часу history | less.

Інший спосіб пошуку за попередньою історією - поступовий пошук: натисніть Ctrl+ Rі почніть вводити підрядку того, що шукаєте. Натисніть Ctrl+, Rщоб перейти до попереднього появи рядка пошуку досі, і Ctrl+ Sякщо ви зайшли занадто далеко. Більшість крім клавіш Ctrl+ R, Ctrl+ S, Backspaceі звичайні символи припинити інкрементний пошук і мають звичайний ефект (наприклад , клавіші зі стрілками , щоб перемістити курсор в рядку ви досягли, Enterщоб виконати команду).


У вашому першому прикладі є помилка
друку

9
Вам потрібно буде зробити до того, stty -ixonяк Ctrl-s запрацює.
Денніс Вільямсон

@Dennis: Нічого, сучасні емулятори терміналів цього не роблять за замовчуванням? <test> Ви праві, навіть gnome-термінал в Ubuntu має контроль над потоком!
Жил "ТАК - перестань бути злим"

Я не знаю, чому вони все ще так роблять. Неможливо щось зловити під час прокрутки. На момент натискання клавіші Ctrl, ви знову отримаєте запит. А повільні серійні зв’язки - це здебільшого минуле.
Денніс Вільямсон

@ Думка Денніса Ctrl-sважлива, інакше хтось застрягне, як я .
imz - Іван Захарящев

15

Ще один невеликий: Alt+#

коментує поточний рядок і переміщує його в буфер історії.

Отже, коли ви збираєте командний рядок, і вам потрібно видати проміжну команду, щоб, наприклад, знайти файл, ви просто натисніть Alt+ #, видаєте іншу команду, ввійдіть в історію, відкоментуйте та продовжуйте.


2
Крім того Esc, #працює
Стівен Пенні

і ви можете фактично ввести його на mac (утримуйте shift, натисніть ESC та # разом), на відміну від інших ket combo (fn + alt + shift + #) ;-)
0xF2

7

Ви можете використовувати магічний простір для розширення історії перед натисканням клавіші Enter. У вашому .inputrc промальовуйте простір до магічного простору:

$if Bash
     Space: magic-space
$endif

Тепер, коли ви вводите пробіл після специфікації історії, він буде негайно розширений - це зручно, якщо ви хочете редагувати і його!



4

Використовуючи Ctrl+rви можете шукати історію:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

Будь-яку команду, яку ви знайдете, можна редагувати ...


Я думаю, що я знайшов саме те, що вам потрібно: запустити shopt -s histverifyі наступного разу, коли ви хочете використовувати !nкоманду, не буде виконано, а лише буде поставлено в командний рядок ...


Ви повинні виконати команду, перш ніж її можна буде шукати за допомогою Ctrl + r, а не того, що просить Вас.
phunehehe

1
Я не розумію, як це не робить того, що він просить. Я додам, що якщо ви хочете спочатку відредагувати команду перед її запуском, ви можете просто натиснути TAB, як тільки знайдете потрібну команду.
Стівен Д

2
Таким чином, процедура буде: (1) Ctrl + r, (2) вводити, поки не знайдеш команду, (3) TAB, (4) команда редагування, (5) Вхід.
Стівен Д

1
@phuenhehe: "Але є подія історії командного рядка, яку я хочу вручну змінити"
pbm

1
Не буде !n:pпрацювати?
alex

1

Я часто хотів цього. Коли я використовував csh (і tcsh), у мене була ідіома:
!:88*:p

Ця ідіома вставляє "слово 88 через останнє слово" попередньої команди в точку, де ви набираєте поточний командний рядок, який, як правило, є кінцевим. У csh, помилка для такого виразу не створює жодних слів. Тобто, не повинно бути ні слова 88, ні будь-якого, що слідує за ним. Якщо немає слова 88, це додає жодних слів до кінця введеної команди, а потім виштовхує отриманий командний рядок в історію без виконання.

Як ви, напевно, знаєте,
*! (як !! і! -1) - попередня команда;
*: 88 - це слово 88 (перше слово - зазвичай команда - дорівнює нулю), і csh вимагає такого слова, але ...
*: 88 * - це всі слова, що починаються зі слова 88, а потім csh робить не вимагати, щоб слово існувало;
*: p означає друк, але не виконувати командний рядок.
З або без: p, командний рядок додається до історії команд.

"Чому 88?" вам цікаво? Тому що це той самий ключ, що і * мені знадобиться. Якщо у вас є такі команди, можливо, це!: 888 *: p - це те, що вам потрібно. Вибачте, це не працює з баш AFAIK. Bash просто скаже bash: :88*: bad word specifier

Веселий факт: зазвичай ваша команда не повинна бути першою.
> /tmp/foo echo My command is word 3
діє в bash та csh.


Оскільки питання позначено bash, було б непогано почати з того, що ваше рішення працює лише в (t) csh.
zagrimsan

0

Я зазвичай використовую Ctrl+ rдля пошуку, а потім Ctrl+ eдля переходу до кінця рядка без виконання.



@JeffSchaller Я цього не бачу. Я бачу посилання CTRL + R. Ні де я не бачу CTRL + E, який є відсутнім фрагментом головоломки у вищезазначених публікаціях.
nikc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.