Najlepszy sposób na przeszukanie historii powłoki

78

Czy jest lepszy sposób na przeszukanie mojego pliku historii pod kątem polecenia niż grep? Mam pojęcie, od czego zaczyna się to polecenie, ale nie wiem, jak daleko sięga do historii.

aktualizacja: poprzednio była specyficzna dla Zsh, ale ze względu na nakładające się odpowiedzi możesz tutaj odpowiedzieć na dowolną powłokę (lub tryb (vi / emacs)), zwróć uwagę, czy jest specyficzna.

ksenoterracid
źródło

Odpowiedzi:

73

Ctrl+ Rjest zwykle najlepszym sposobem, jak powiedział deskryptor . Możesz także użyć !string, która uruchamia najnowszą komendę zaczynającą się od string, lub !?string?, która uruchamia najnowszą komendę zawierającą string.

(Myślę, że to jedyna kwestia istotna dla tego pytania, ale w tej odpowiedzi omówiłem znacznie więcej poleceń historii )

Michał Mrożek
źródło
4
jak sprawić, by wyglądało tak „ctrl + r”?
ksenoterrakid
13
@xen <kbd>Ctrl+R</kbd>. źródło odpowiedzi
Michael Mrozek
Nie zdawałem sobie sprawy, że silnik SE zaakceptował jakiekolwiek podziękowania HTML.
ksenoterrakid
Nie wiedziałem, że słowo kluczowe kbd poprawnie interpretuje „ctrl” i „+”! Kiedyś oznaczałem każdy klucz osobno. dzięki!
Olivier Dulac
2
@OlivierDulac Niestety tak nie jest, właśnie tak formatowałem klucze; ktoś później zredagował moją odpowiedź, aby utworzyć osobne klucze
Michał Mrożek
30

Korzystając z Bash, wpisz Control- Ra następnie zacznij pisać. Wpisywanie Control- Rkilkakrotnie po wprowadzeniu tekstu przesunie Cię z powrotem do pasujących wierszy poleceń.

Grendel
źródło
18

Nie jestem pewien, czy to pomoże, ale lubię używać ctrl- ra następnie zacząć pisać polecenie. Powinien przejrzeć twoją historię i zaprezentować ci pierwszy mecz. Aby przełączać mecze, po prostu naciśnij ctrl- rponownie.

deszyfrator
źródło
2
Przepraszam, zapomniałem o Zsh. Być może będziesz musiał dodać to skrót klawiszowy do ~ / .zshrc: bindkey '^ R' history-incremental-search-backward
decryptor
17

Jeśli dodasz następujące do ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

i ponownie uruchom Bash, możesz zacząć pisać, a następnie użyć Page Upi, Page Downaby przejść do tyłu i do przodu w historii linii zaczynając od tego samego przedrostka, który właśnie wpisałeś.

(Niektórzy wolą używać \e[Ai \e[B, który zastąpi normalne Upi Downakcje zamiast przypisywania nowych kluczy.)

efemeryczny
źródło
Wolę zamapować te polecenia na Alt + Upi Alt + Down. W zależności od emulacji klawiatury, którą emuluje terminal, te kombinacje mogą być mapowane na \E[Ai \E[A(np. Konsola KDE z Linux Key Bindings) lub \E[1;3Ai \E[1;3B(np. Terminal XFCE lub Konsola KDE z X Free 4 Bindings).
Christian Herenz
9

Interaktywny monit wywoływany przez Ctrl- R, o którym już wspomniano, jest najwygodniejszym sposobem. Ponadto popularne jest mapowanie klawiszy strzałek Upi Downprzeszukiwanie historii w celu znalezienia prefiksu aktualnie w wierszu poleceń, jednak wymaga to pewnych zmian w ~/.inputrcpliku .

Klasycznym i mniej interaktywnym rozwiązaniem jest użycie rozszerzenia historii powłoki. Pisanie na maszynie

!foo

wykona ostatnie polecenie, które zaczyna się od fooi

!?foo

wykona ostatnie polecenie, które zawiera foo. Więcej informacji na temat rozszerzania historii można znaleźć w podręczniku Bash , zakładając, że twoja powłoka jest Bash lub kompatybilna.

Adam Byrtek
źródło
6

Jeśli dodasz stty -ixondo swojego ~/.bashrcpliku, wówczas Ctrl- spójdzie w przeciwnym kierunku do Ctrl- r.

Dennis Williamson
źródło
Chciałem użyć C-sdo tego celu, ale mój terminal zamarzł ; strzec się! (Cóż, jeszcze nie zatrudniłem stty ixon, nie jestem pewien, po co to jest.)
imz - Ivan Zachararyszew
3
@imz: C-q„ odmrozi ”. Jest C-sto zwykłe oprogramowanie sterujące przepływem znaków, które kiedyś było przydatne do ręcznego przerwania (pauzy) przepływu wyjściowego, gdy zastosowano wolne połączenia szeregowe. Teraz wyjście jest tak szybkie w większości przypadków, że to, co chcesz zobaczyć po naciśnięciu, C-szostało już przewinięte. stty -ixonwyłącza kontrolę przepływu oprogramowania.
Dennis Williamson
Fantastyczny! Przez lata szukałem sposobu na przewijanie historii w taki sposób.
marlar
3

Jeśli wpiszesz, !lsbash przejrzy twoją historię i wykona ostatnie polecenie zaczynające się na „ls”

Kevin M.
źródło
2

może być specyficzny dla Zsh. Badając tę odpowiedź , znalazłem, vi-history-search-backward który pozwala przeszukiwać /w trybie vi (o którym nie wspomniałem, że jestem w), a następnie możesz używać ni Nprzeszukiwać odpowiednio do przodu i do tyłu (po naciśnięciu enter).

ksenoterracid
źródło
2

Dziwię się, że o tym nie wspomniano - ale możesz wybrać tryb vi w bash lub ksh, wykonując następujące czynności:

set -o vi

... lub używając tego jako zawartości ~/.inputrc(dla readline GNU używanego w programach takich jak bash):

set editing-mode vi

Następnie możesz użyć, Escaby przejść do trybu poleceń i użyć, kaby cofnąć się w historii i jprzejść do przodu. Możesz także wyszukiwać za pomocą, /aby wyszukiwać normalnie i ?wyszukiwać wstecz.

Jeśli użyjesz ~/.inputrc, to zadziała nie tylko w GNU bash, ale we wszystkim, co korzysta z readline GNU, takim jak CLISP i ewentualnie programy, takie jak powłoka poleceń MySQL i powłoka CPAN.

Mei
źródło
2

Aby przejść do przodu podczas korzystania z wyszukiwania wstecznego (z poleceniem Ctrl-R):

  1. Otwórz plik .bashrc:
    sudo gedit ~/.bashrc

  2. dodaj ten wiersz (literę „f” można zastąpić inną, jeszcze nie używaną przez system)

    bind '"\C-f": forward-search-history' 
  3. Zamknij plik i zaktualizuj .bashrc (lub otwórz inny terminal) za pomocą polecenia:
    source ~/.bashrclub. ~/.bashrc

TERAZ MOŻESZ PRZESUWAĆ HISTORIĘ W SKRÓCIE: Ctrl + f

Praca na Ubuntu 18.04 LTS

Franklin TCHATATH
źródło
1

Najczęściej używam następujących dwóch.
Pamiętaj jednak, że obaj szukają początkowych znaków.

  1. tcsh : wpisz kilka znaków polecenia, a następnie Esc+ ppokaże poprzednie polecenie, zaczynając od tej sekwencji klawiszy, naciśnij je ponownie, pokaże kolejne polecenie.
  2. ksh : użyj fc -e - <SPACE> <first few char for your previous >tego spowoduje uruchomienie ostatniego polecenia pasującego do tej sekwencji.

Nie mogłem znaleźć czegoś takiego jak Ctrl+ Rw Bash dla mojego ksh i tcsh.

Hemant
źródło
3
Ctrl + r działa trochę inaczej w ksh niż Bash. Naciśnij Ctrl + r, a następnie wpisz szukany ciąg i naciśnij klawisz Enter . Aby wyszukać to samo, naciśnij Ctrl + r i wprowadź bez konieczności ponownego wpisywania łańcucha. Jest to set -o emacstryb, w drodze.
Dennis Williamson,
@Dennis: +1 :-)
Hemant
1

Istnieje sposób użycia Ctrl- Rz tcsh . Dodaj następujące elementy do ~/.cshrc:

bindkey "^r" i-search-back (to tylko znak karetki i litera r)

To dla mnie największa oszczędność czasu.

duży nos
źródło
1

podobna odpowiedź do @ephemient, ale możesz umieścić w swoim .bashrc

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-foward'

i wpisz część frazy, a następnie użyj strzałki w górę / w dół, aby przejrzeć najnowsze pasujące opcje. Jest to domyślne zachowanie Matlaba.

Dla większości ludzi, jeśli chcesz przenieść swoje ustawienia do nowego systemu, łatwiej jest pamiętać, aby zaczepić tylko ~/.bashrcto, że musisz zaczepić to~/.inputrc

Matt S.
źródło
0

Tak, istnieje, przynajmniej jeśli używasz zsh. Po prostu zacznij wpisywać polecenie, a następnie naciśnij M-p( ESC p), a znajdziesz poprzednie polecenia pasujące do wpisanego tekstu . Naciśnij ponownie, aby znaleźć następny mecz.

dkagedal
źródło
Ta odpowiedź może zawierać więcej wyjaśnień.
phunehehe