Як пройти цикл за допомогою зворотного пошуку в BASH?


443

У терміналі я можу набрати CTRL-Rдля пошуку відповідної команди, раніше введеної в BASH. Наприклад, якщо я друкую , CTRL-Rто grepє списки моя остання grepкоманда, і я можу натиснути кнопку введення , щоб використовувати його. Це дає лише одну пропозицію. Чи є якийсь спосіб перейти через інші раніше набрані відповідні команди?

Відповіді:


596

Якщо я правильно розумію питання, ви повинні мати можливість переглядати альтернативи, повторюючи їх Ctrl+R.

Наприклад:

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

Це шукає назад у вашій історії. Щоб шукати вперед, використовуйте Ctrl+S, але, можливо, вам доведеться встановити: stty -ixon( .bash_profileабо вручну) перед цим, щоб вимкнути функцію XON / XOFF, яка переймає цю функцію Ctrl+s. (Детальніше тут .)


23
+1 - FYI - ви також можете шукати вперед відповідно до цієї відповіді StackOverflow .
Ардано Ардано

7
І використовуйте Ctrl + Shift + r для зворотної прокрутки, якщо вам трапиться перейти.
wiswit

19
@wiswit CTRL+SHIFT+rне працює для мене.
Максим Суслов

9
@MaximSuslov Дивіться це запитання: stackoverflow.com/questions/791765/… Ви можете додати [[ $- == *i* ]] && stty -ixonдо свого .bashrc, а потім CTRL+sбуде працювати як зворотний бікCTRL+r
gla3dr

9
@JordanArseno Я взяв "пошук вперед" означаючи "пошук команд, яких я ще не набрав"
Джош Джонсон

234

Якщо ви вважаєте, що команда буде використовуватися часто, ви можете додати тег

команда # корисна

Тоді

ctrl+r #useful

Це працює, тому що #це роздільник коментарів, тобто все, що виникає після символу, не трактується як команда. Однак це буде записано в історію і таким чином підлягає пошуку.


5
Зазвичай мені подобається такий вид маркування. #trg_bld #open_log
Makesh

1
куди додати цей тег?
Судіп Бхандарі

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

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
Як писали falconepi в коментарях до цієї відповіді , на Ubuntu вам просто потрібно розлучити ~/.inputrcдва рядки, включаючи історію-пошук- *
Арпад Горват

Ви також можете переглянути цю публікацію, щоб отримати детальну інформацію про цю відповідь: codeinthehole.com/writing/…
Андрій

Це не було стандартом для мого macOS (10.13). Я завжди пропускав цю функціональність!
1818

Хороша річ у тому, що ви все ще можете використовувати ctrl-p / ctrl-n для регулярного
скимінгу

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.