2009-07-17 19:23:49 +0000 2009-07-17 19:23:49 +0000
302
302

Jak mogę przeszukać historię basha i powtórzyć polecenie?

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

Odpowiedzi (10)

38
38
38
2009-07-17 20:40:32 +0000

Jako alternatywę dla crtl+R, możesz przeszukać historię wpisując

!text

To przeszuka historię w poszukiwaniu ostatniego polecenia rozpoczynającego się od ‘text’.

Ale sugeruję, abyś umieścił to w swoim .bashrc, aby zapobiec wykonaniu błędnej komendy.

shopt -s histverify

To instruuje bash tak, że po jakichkolwiek działaniach w historii (jak !!:s/prev_text/after_text), umieszcza wynikowy wiersz w wierszu poleceń. Można wtedy przejrzeć lub edytować polecenie, a następnie nacisnąć Enter.

33
33
33
2009-07-17 20:21:39 +0000

Można też zrobić:

history | grep "stuff"

to zwróci coś w stylu

num stuff

wtedy można wpisać

!num
```.
16
16
16
2011-02-02 20:32:12 +0000

Wolę używać history-search-backward niż reverse-search-history. Ten pierwszy pozwala na wpisanie kilku znaków polecenia potem wciśnięcie klawisza szukania, w przeciwieństwie do wciśnięcia najpierw klawisza szukania, a potem wpisania szukanego łańcucha.

Domyślnie w moim systemie, M-p i M-n przypisane są do podobnych funkcji, ale ja wolę przypisać je do klawiszy strzałek:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
13
13
13
2014-09-25 16:45:14 +0000

Mam naprawdę świetny alias, h. To tak naprawdę po prostu “history | grep”, ale odfiltrowuję poprzednie wpisy “komendy h” za pomocą “grep -E -v”

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

używane jak

h aliases
2003 less .bash_aliases
12
12
12
2009-09-10 14:23:48 +0000

Świetny opis, Sean! Umieściłbym to w komentarzu, ale brakuje mi kilku punktów reputacji :-)

Inną powiązaną i użyteczną techniką jest możliwość uruchomienia poprzedniego polecenia podczas zmiany słowa. Powiedzmy, że popełniłeś literówkę w nazwie katalogu, lub chcesz zmienić nazwę pliku:

$ echo my name is bob my name is bob $ ^bob^jordan echo my name is jordan my name is jordan

Zauważ, że polecenie jest interpretowane, zastępowane i wypisywane przed jego wykonaniem, więc jeśli zostanie wykonane niewłaściwe polecenie, możesz zobaczyć, co bash myślał, że robi.

6
6
6
2014-12-18 16:37:14 +0000

Ponieważ nawigacja po historii za pomocą Ctrl-r jest IMO kłopotliwa, warto rozważyć hh : https://github.com/dvorka/hstr

co czyni nawigację znacznie prostszą, bezpośrednią i efektywną - włączając w to uruchomienie polecenia:

.

4
4
4
2014-09-04 04:55:04 +0000

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

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

3
3
3
2015-11-22 15:21:56 +0000

Jeśli masz swoją powłokę skonfigurowaną do używania przypisań klawiszy vi (set -o vi lub set editing-mode vi w $HOME/.inputrc), to wyszukujesz przy pomocy <Esc>/some-command<Return> i uderzasz n (następny) lub Shift-n (poprzedni), aby cyklicznie przeglądać historię wiersza poleceń.

2
2
2
2014-09-04 05:11:10 +0000

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

$ history | grep keyword
0
0
0
2019-05-22 13:17:52 +0000

Lubię HSTR, ale czasami nie mogę go zainstalować. Napisałem więc alias używając fzf , który naśladuje jego zachowanie (hx, dla “history execute”)

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : cóż, pobierz historię
  • sed : usuń kolumnę numeryczną z listy (POSIX)
  • fzf : tu jest magia, pozwala na interaktywne przeszukiwanie listy, lub poruszanie się z C-J i C-K, a następnie wykonanie polecenia z Enter.
  • --height : ustawia liczbę wyświetlanych linii.
  • --tac : odwróć listę (bardziej logiczne dla historii)
  • --tiebreak=index : zachowaj kolejność historii, gdy fzf uaktualnia wyniki