поместить команду истории в командную строку, не выполняя ее


57

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

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

Лучший,

Ответы:


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чтобы выполнить команду).


В вашем первом примере есть опечатка ...
pbm

9
Это нужно сделать stty -ixonдо того, как Ctrl-s сработает.
Деннис Уильямсон

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

Я не знаю, почему они все еще делают. Невозможно поймать что-то во время прокрутки. К тому времени, когда вы нажимаете Ctrl-s, у вас снова появляется приглашение. А медленные последовательные соединения в основном остались в прошлом.
Деннис Уильямсон

@ Суть Денниса Ctrl-sважна, иначе я застряну, как я .
imz - Иван Захарящев

15

Еще один маленький: Alt+#

закомментирует текущую строку и переместит ее в буфер истории.

Поэтому, когда вы собираете командную строку и вам нужно ввести временную команду, например, чтобы найти файл, вы просто нажимаете Alt+ #, вводите другую команду, заходите в историю, раскомментируете и продолжаете.


2
Кроме того Esc, #работает
Стивен Пенни

и вы можете набрать его на Mac (удерживая Shift, нажмите ESC и # вместе), в отличие от других комбо кетов (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, а не того, что просит Vass.
phunehehe

1
Я не понимаю, как это не делает то, что он просит. Я бы добавил, что если вы хотите сначала отредактировать команду перед ее запуском, вы можете просто нажать TAB, как только вы найдете правильную команду.
Стивен Д

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

1
@phuenhehe: «Но есть событие истории командной строки, которое я хочу изменить вручную»
pbm

1
Не !n:pсработает?
Алекс

1

Я часто хотел этого. Когда я использовал csh (и tcsh), у меня была идиома:
!:88*:p

Эта идиома вставляет «слово 88 через последнее слово» предыдущей команды в точку, где вы набираете текущую командную строку, что обычно является концом. В csh это не ошибка для такого выражения, чтобы не создавать слов. То есть не должно быть ни слова 88, ни следующего за ним. Если нет слова 88, это не добавляет слов в конец набираемой команды, а затем помещает полученную командную строку в историю без выполнения.

Как вы, наверное, знаете,
*! (как !! и! -1) - предыдущая команда;
*: 88 - это слово 88 (первое слово - обычно это команда - ноль), и csh потребует, чтобы такое слово существовало, но ...
*: 88 * - это все слова, начинающиеся со слова 88, а затем csh делает не требовать слово для существования;
*: p означает печать, но не выполняет командную строку.
С или без: p, командная строка добавляется в историю команд.

"Почему 88?" Вы задаетесь вопросом? Потому что это тот же ключ, что и * мне понадобится. Если у вас есть такие длинные команды, возможно!: 888 *: p - это то, что вам нужно. Извините, это не работает с bash AFAIK. Баш просто скажет bash: :88*: bad word specifier

Интересный факт: ваша команда обычно не должна быть первой.
> /tmp/foo echo My command is word 3
действует в bash и csh.


Поскольку вопрос помечен для bash, было бы неплохо начать с того, что ваше решение работает только в (t) csh.
Загримсан

0

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



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