Czy mogę przeszukać historię w bashu i uruchomić wynik?
Czy mogę przeszukać historię w bashu i uruchomić wynik?
Odpowiedzi:
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-history
powią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 bash
stronę podręcznika .
Bash ma wiele możliwości wyszukiwania i dostępu do interaktywnej historii poleceń. Najbardziej podstawowym z nich jest history
wbudowany. 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 clear
polecenie. Wbudowana historia ma wiele funkcji, więcej można zobaczyć na stronach man bash
i 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ć vim
ponownie, 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ć, bash
aby 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 clear
ponownie 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 shopt
wbudowanego:
$ 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 .bashrc
pliku startowym, aby była ustawiona przy każdym logowaniu.
Jak już wspomniano, wszystkie te informacje można uzyskać ze strony podręcznika bash
man . Dla !, !! i!? desygnatorzy, spójrz na sekcję 9.3 Rozszerzenie historii .
shopt
idzie w bashrc, a nie w bash_profile (lub nie zostanie włączony dla powłok, które nie są powłokami logowania).
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.
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'
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
HISTIGNORE
.
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ł.
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:
ctrl + r
teraz domyślnie
Jeśli twoja powłoka skonfigurowany do korzystania z vi
klawiszy ( set -o vi
lub mający set editing-mode vi
w $HOME/.inputrc
), a następnie szukać z <Esc>/some-command<Return>
mocno n
(NEXT) lub Shift-n
(poprzedni) do cyklu przez historię wiersza poleceń.
Lubię HSTR, ale czasami nie mogę go zainstalować. Napisałem więc alias przy użyciu fzf, który naśladuje jego zachowanie ( hx
dla „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-J
i 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