Jak mogę przeszukać historię bash i ponownie uruchomić polecenie?

297

Czy mogę przeszukać historię w bashu i uruchomić wynik?

Richard Hoskins
źródło

Odpowiedzi:

428

Wpisz Ctrl Rw wierszu polecenia i zacznij wpisywać poprzednie polecenie. Gdy pojawi się wynik, uderzaj dalej, Ctrl Raby zobaczyć inne mecze. Gdy pojawi się żądane polecenie, po prostu naciśnijEnter

Pamiętaj, że while Ctrl Rjest ustawieniem domyślnym, jeśli chcesz reverse-search-historypowiązać polecenie ( ), Ctrl Tmożesz to skonfigurować w następujący sposób:

powiązanie „\ Ct”: historia wyszukiwania wstecznego

Dostępnych jest również wiele innych możliwych do powiązania poleceń readline. Spójrz na bashstronę podręcznika .

Bash ma wiele możliwości wyszukiwania i dostępu do interaktywnej historii poleceń. Najbardziej podstawowym z nich jest historywbudowany. Wpisując tylko:

$ historia

Wyświetli listę poleceń wraz z indeksem liczbowym, np .:

$ historia
1 czysty
2 ls -al
3 vim ~ / somefile.txt
4 historia
$

Możesz następnie wykonać dowolne z tych poleceń, używając ich indeksu numerycznego, zastępując indeks jednym !, jak zauważył Mitch :

$ 1

Wykona clearpolecenie. Wbudowana historia ma wiele funkcji, więcej można zobaczyć na stronach man bashi history.

Możesz również określić względne ujemne przesunięcia podczas używania !desygnatora, więc korzystając z naszej listy historii powyżej, jeśli chcielibyśmy wykonać vimponownie, moglibyśmy:

$! -2

Co w zasadzie mówi bashowi, aby wykonał polecenie, które wykonałeś „dwa polecenia temu”. Aby uruchomić poprzednie polecenie z listy historii, możemy po prostu użyć !!(co jest po prostu skrótem !-1).

!Oznacznik nie ogranicza Ci numerycznie określające, które polecenie do uruchomienia. Hayalci pokazał, że możesz poinstruować, bashaby wykonać polecenie na podstawie tekstu, od którego zaczyna (użycie !) lub tekstu w samym poleceniu (użycie !?). Ponownie, korzystając z naszej przykładowej listy historii powyżej, jeśli chcemy clearponownie wykonać , wystarczy wpisać:

$! cl

i naciśnij Enter. A co vim? To jest tak proste jak:

$!? niektóre

Najważniejszym punktem odpowiedzi Hayalci jest wezwanie do shoptwbudowanego:

$ shopt -s histverify

Umożliwi to weryfikację historię tak, że polecenia, które są dopasowane przez !, !!oraz !?Oznaczenia nie są ślepo wykonywane, lecz wypełnione w linii poleceń, dzięki czemu można zapewnić zrobią nic złego przed ich wykonaniem. Jest to jeszcze ważniejsze, gdy wykonujesz polecenia jako użytkownik root. Tę opcję można ustawić w .bashrcpliku startowym, aby była ustawiona przy każdym logowaniu.

Jak już wspomniano, wszystkie te informacje można uzyskać ze strony podręcznika bashman . Dla !, !! i!? desygnatorzy, spójrz na sekcję 9.3 Rozszerzenie historii .

Społeczność
źródło
39
+1 Używam Linuksa od ponad 12 lat dla wszystkich systemów. Nie wiedziałem, że istnieje. Chciałbym móc +10 jak mi tego brakowało ??
Aiden Bell
1
W wielu systemach naciśnięcie strzałki w górę robi to samo.
mas
Gdyby ktoś skonsolidował „!”, „!!”, „!?”, „History | grep ”i„ ctrl-r ”w wyczerpującą odpowiedź, wybrałbym ją
Richard Hoskins
shoptidzie w bashrc, a nie w bash_profile (lub nie zostanie włączony dla powłok, które nie są powłokami logowania).
Tobu
2
Również po naciśnięciu CTRL + R możesz użyć CTRL + SHIFT + R wiele razy, aby przejść z powrotem do poprzedniego polecenia
Gal Bracha,
37

Alternatywnie crtl+Rmożesz przeszukiwać historię, pisząc

!text

Spowoduje to przeszukanie historii najnowszego polecenia zaczynającego się od „text”.

Ale sugeruję, abyś umieścił to w swoim .bashrc, aby zapobiec wykonaniu niewłaściwego polecenia.

shopt -s histverify

To instruuje bash tak, aby po wszelkich historycznych akcjach (jak !!:s/prev_text/after_text) umieszczał wynikową linię w wierszu polecenia. Następnie możesz przejrzeć lub edytować polecenie, a następnie naciśnij klawisz Enter.

Hayalci
źródło
5
Użyj!? Text, aby ponownie wykonać najnowszą komendę zawierającą (zamiast zaczynać od) „tekst”.
mark4o
3
Gdyby ktoś skonsolidował „!”, „!!”, „!?”, „History | grep ”i„ ctrl-r ”w wyczerpującą odpowiedź, wybrałbym to.
Richard Hoskins,
32

Możesz także:

history | grep "stuff"

zwróciłoby coś takiego

num stuff

wtedy możesz wpisać

!num
Mitch
źródło
15

Wolę używać wyszukiwania historii do tyłu niż wyszukiwania wstecz. Pierwszy z nich pozwala wpisać kilka znaków polecenia, a następnie nacisnąć klawisz wyszukiwania, zamiast naciskać klawisz wyszukiwania, a następnie wpisywać szukany ciąg.

Domyślnie w moim systemie Mp i Mn wiążą się z podobnymi funkcjami, ale wolę powiązać klawisze strzałek:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
Keith
źródło
13

Mam naprawdę świetny alias, h. To tak naprawdę „historia | grep”, ale odfiltrowuję poprzednie wpisy „h polecenia” za pomocą „grep -E -v”

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

używane jak

h aliases
2003  less .bash_aliases
CurtH
źródło
1
Można to również osiągnąć, dodając polecenie do HISTIGNORE.
tanenbring
12

Doskonałe napisanie, Sean! Umieściłbym to w komentarzu, ale brakuje mi kilku punktów reputacji. :-)

Inną powiązaną i przydatną techniką jest możliwość uruchomienia poprzedniego polecenia podczas zmiany słowa. Powiedzmy, że wpisałeś nazwę katalogu lub chcesz zmienić nazwę pliku:

$ echo mam na imię Bob
mam na imię Bob
$ ^ bob ^ jordan
echo mam na imię Jordan
Nazywam się Jordan

Zauważ, że polecenie zostało rozwinięte, zastąpione i wypisane przed uruchomieniem polecenia, więc jeśli uruchomione zostanie niewłaściwe polecenie, możesz zobaczyć, co bash myślał.

Jordania
źródło
6

Ponieważ nawigacja w historii za pomocą Ctrl-r jest uciążliwa dla IMO, warto rozważyć hh :

https://github.com/dvorka/hstr

co sprawia, że ​​nawigacja jest znacznie prostsza, bezpośrednia i wydajna - w tym uruchomienie polecenia:

wprowadź opis zdjęcia tutaj

Martin Dvorak
źródło
Jak tego użyć? Które klawisze nacisnąć, aby zobaczyć to zdjęcie?
Nakilon
2
Po zainstalowaniu hh możesz użyć polecenia hh LUB powiązać go z dowolnym skrótem klawiaturowym (zwykle Ctrl-r) zgodnie z opisem w dokumentacji.
Martin Dvorak,
wiąże się ctrl + rteraz domyślnie
Alleo,
4

W wierszu polecenia bash wpisz control-R, a następnie wpisz kilka znaków żądanego polecenia, a funkcja readline bash przeszuka historię poleceń dla tego polecenia.

Po rozpoczęciu wyszukiwania możesz ponownie wpisać control-R, aby przejść do następnego pasującego polecenia.

John1024
źródło
3

Jeśli twoja powłoka skonfigurowany do korzystania z viklawiszy ( set -o vilub mający set editing-mode viw $HOME/.inputrc), a następnie szukać z <Esc>/some-command<Return>mocno n(NEXT) lub Shift-n(poprzedni) do cyklu przez historię wiersza poleceń.

Fernando Basso
źródło
Ten jest najbliższy użytkownikom vima.
Gabor Marton,
2

CTRL+ Rdziała dobrze, jak sugerował @ John1024, ale jest nieco nudne, jeśli wiele z ostatnich poleceń jest podobnych i chcesz szybko przeskanować je wszystkie. Alternatywą byłoby użycie history:

$ history | grep keyword
Mureinik
źródło
0

Lubię HSTR, ale czasami nie mogę go zainstalować. Napisałem więc alias przy użyciu fzf, który naśladuje jego zachowanie ( hxdla „historii wykonania”)

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : cóż, poznaj historię
  • sed : usuń kolumnę liczb z listy (POSIX)
  • fzf: oto magia, pozwala interaktywnie przeszukiwać listę interaktywnie lub poruszać się za pomocą C-Ji C-K, a następnie wykonać polecenie za pomocą Enter.
  • --height : ustaw liczbę wyświetlanych linii.
  • --tac : przywróć listę (bardziej logiczne dla historii)
  • --tiebreak=index : zachowaj porządek historii, gdy fzf aktualizuje wyniki
Biggybi
źródło