Как перебрать реверсивный поиск в BASH?


445

В терминале я могу набрать CTRL-Rдля поиска подходящей команды, ранее набранной в BASH. Например, если я набираю, CTRL-Rто grepперечисляет мою последнюю grepкоманду, и я могу нажать Enter, чтобы использовать ее. Это только дает одно предложение, хотя. Есть ли способ циклически проходить через другие ранее набранные совпадающие команды?

Ответы:


599

Если я правильно понимаю вопрос, вы сможете циклически выбирать альтернативы, многократно нажимая Ctrl+R.

Например:

Ctrl+R grep Ctrl+R Ctrl+R ...

Это ищет в обратной истории. Вместо этого используйте поиск Ctrl+S, но вам может потребоваться установить: stty -ixon( .bash_profileвручную или вручную) перед этим, чтобы отключить функцию XON / XOFF, которая вступает во владение Ctrl+s. (Подробнее здесь .)


23
+1 - к вашему сведению - вы также можете искать вперед согласно этому ответу StackOverflow .
Джордан Арсено

7
И используйте Ctrl + Shift + r для обратной прокрутки, если вы случайно перешли.
Висвит

19
@ Wiswit CTRL+SHIFT+rне работает для меня.
Максим Суслов

9
@MaximSuslov Посмотрите этот вопрос: stackoverflow.com/questions/791765/… Вы можете добавить [[ $- == *i* ]] && stty -ixonв свой .bashrc, а затем CTRL+sработать в обратном направленииCTRL+r
gla3dr

9
@JordanArseno «поиск вперед» означал «поиск команд, которые я еще не набрал»
Джош Джонсон,

235

Если вы чувствуете, что команда будет использоваться часто, вы можете добавить тег

команда #useful

затем

ctrl+r #useful

Это работает, потому что #это разделитель комментариев, то есть все, что идет после символа, не интерпретируется как команда. Тем не менее, он будет записан в истории и, следовательно, для поиска.


5
Обычно мне нравятся такие пометки. #trg_bld #open_log
Makesh

1
где добавить этот тег?
Судип Бхандари

5
@SudipBhandari сразу после вашей команды. # начинает комментарий. Например, ls -lah #useful
Андрей

У Unix были хэштеги, прежде чем было круто :)))
Бобби Маринов

47

Вы также можете настроить стрелки вверх и вниз для выполнения немного другого поиска, добавив эти строки в ~ / .inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Вместо поиска подстроки в любом месте команды (например, Ctrl-r ) она будет искать команду, начинающуюся с текста слева от курсора . Например, если я запускаю эти команды:

$ ls bart
$ ls fools

затем напечатайте lsи нажмите Upдважды, он покажет ls bartи курсор в том же месте. Сравните с Ctrl- r, где он найдет lsдважды в последней строке, так что вам придется нажать еще раз, чтобы найти предыдущую строку.

Оба подхода имеют свои сильные стороны, и оба могут сэкономить много времени.


2
Это также стандарт для OS X, поэтому вам не нужно создавать ~/.inputrcи добавлять эти две строки.
DASKAjA

1
Как написал Фальконепи в комментариях к этому ответу , в Ubuntu вам просто нужно раскомментировать в ~/.inputrcдве строки, включая history-search- *
Arpad Horvath

Вы также можете посмотреть этот пост для получения более подробной информации об этом ответе: codeinthehole.com/writing/…
Андрей

Это не было стандартным для моей macOS (10.13). Я всегда скучал по этой функциональности!
forthrin

хорошо, что вы все еще можете использовать ctrl-p / ctrl-n для регулярного просмотра истории
elig

0

Там есть замена для встроенной Ctrl + Rпод названием hstr . Это позволяет искать историю команд, совпадающую со всеми токенами поиска одновременно (между прочим), и просматривать результаты с помощью клавиш со стрелками:

пример

Вот демонстрационный скринкаст .

Его можно установить на ОС семейства Debian, например:

add-apt-repository ppa:ultradvorka/ppa
apt-get update
apt-get install hstr

hstr --show-configuration >> ~/.bashrc

А затем используйте Ctrl + R(после повторного открытия терминала).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.