Jak przełączać się między wyszukiwaniem wstecznym i wyszukiwaniem w BASH?

443

W terminalu mogę pisać, CTRL-Raby wyszukać pasujące polecenie wcześniej wpisane w BASH. Na przykład, jeśli wpisuję CTRL-Rnastępnie grepjest mój ostatni list greppoleceń, i mogę nacisnąć enter aby go używać. To daje tylko jedną sugestię. Czy jest jakiś sposób na przełączanie się między innymi wcześniej wpisanymi pasującymi poleceniami?

Wioska
źródło

Odpowiedzi:

596

Jeśli dobrze rozumiem pytanie, powinieneś być w stanie przełączać się między alternatywami, wielokrotnie uderzając Ctrl+R.

Na przykład:

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

To przeszukuje twoją historię wstecz. Aby zamiast tego wyszukiwać dalej, użyj Ctrl+S, ale może być konieczne ustawienie wcześniej: stty -ixon( .bash_profileręcznie lub ręcznie), aby wyłączyć przejmującą funkcję XON / XOFF Ctrl+s. (Więcej informacji tutaj .)

Runium
źródło
23
+1 - FYI - możesz również wyszukiwać do przodu zgodnie z odpowiedzią StackOverflow .
Jordan Arseno
7
I użyj Ctrl + Shift + r do przewijania do tyłu, jeśli zdarzy ci się ominąć.
wiswit
19
@wiswit CTRL+SHIFT+rnie działa dla mnie.
Maxim Suslov,
9
@MaximSuslov Zobacz to pytanie: stackoverflow.com/questions/791765/... Możesz dodać [[ $- == *i* ]] && stty -ixondo swojego .bashrc, a następnie CTRL+sbędzie działał jako odwrotnośćCTRL+r
gla3dr 21.04.2016
9
@JordanArseno Podjąłem słowo „szukaj dalej”, co oznacza „szukaj poleceń, których jeszcze nie wpisałem”
Josh Johnson
234

Jeśli uważasz, że polecenie będzie często używane, możesz dodać znacznik

polecenie # przydatne

Następnie

ctrl+r #useful

Działa #to, ponieważ jest ogranicznikiem komentarza, tzn. Wszystko, co następuje po symbolu, nie jest interpretowane jako polecenie. Zostanie jednak zapisany w historii, dzięki czemu można go przeszukiwać.

Sathyam
źródło
5
Zazwyczaj lubię tego rodzaju tagowanie. #trg_bld #open_log
Makesh
1
gdzie dodać ten tag?
Sudip Bhandari
5
@SudipBhandari zaraz po twoim poleceniu. # rozpoczyna komentarz. Np. Ls -lah #useful
Andrei
47

Możesz także skonfigurować strzałki w górę i w dół, aby wyszukiwać nieco inaczej, dodając te linie do ~ / .inputrc:

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

Zamiast szukać podciągu w dowolnym miejscu polecenia (jak Ctrl-r ), szuka polecenia zaczynającego się od tekstu po lewej stronie kursora . Na przykład, jeśli uruchomię następujące polecenia:

$ ls bart
$ ls fools

następnie wpisz lsi naciśnij Updwukrotnie, pokaże się ls barti kursor w tym samym miejscu. Porównaj z Ctrl- r, gdzie znajdzie lsdwa razy w ostatniej linii, więc będziesz musiał nacisnąć go jeszcze raz, aby znaleźć poprzednią linię.

Oba te podejścia mają swoje mocne strony i oba mogą zaoszczędzić dużo czasu.

l0b0
źródło
2
Jest to również standard w OS X, więc nie musisz tworzyć ~/.inputrci dodawać tych dwóch linii.
DASKAjA,
1
Jak napisali falconepi w komentarzach do tej odpowiedzi , na Ubuntu musisz tylko odkomentować w ~/.inputrcdwóch liniach, w tym w wyszukiwaniu historii- *
Arpad Horvath
Możesz również spojrzeć na ten post, aby uzyskać więcej informacji na temat tej odpowiedzi: codeinthehole.com/writing/…
Andrei
To nie było standardowe w moim systemie macOS (10.13). Zawsze tęskniłem za tą funkcjonalnością!
forwardrin
dobrą rzeczą jest to, że nadal możesz używać ctrl-p / ctrl-n do regularnego przeglądania historii
elig
0

Istnieje zamiennik wbudowanego o Ctrl + Rnazwie hstr . Umożliwia przeszukiwanie historii poleceń pasujących do wszystkich tokenów wyszukiwania w tym samym czasie (między innymi) i przełączanie wyników za pomocą klawiszy strzałek:

Przykład

Oto zrzut ekranu pokazowy .

Można go zainstalować w systemie operacyjnym z rodziny Debian, takim jak:

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

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

A następnie użyj Ctrl + R(po ponownym otwarciu terminala).

saaj
źródło