Do nawigacji w historii poleceń możemy użyć strzałek w górę iw dół.
W niektóre IDE, takie jak Matlab, jeśli coś wprowadzimy, a następnie naciśniemy klawisze strzałek, przewijamy tylko polecenia historii, zaczynając od tego, co wprowadziliśmy. To bardzo wygodne, ale w terminalu powłoki to nie działa.
Czy jest jakiś sposób na uzyskanie podobnej funkcji w terminalu powłoki? Czy masz jakieś inne wskazówki dotyczące poprawy wydajności w korzystaniu z terminala?
Komentarze
Odpowiedz
To, czego szukasz, to Ctrl R .
Wpisz Ctrl R , a następnie wpisz część żądanego polecenia. Bash wyświetli pierwsze pasujące polecenie. Kontynuuj wpisywanie Ctrl R , a bash przejdzie przez poprzednie pasujące polecenia.
Aby przeszukać wstecz w historii, naciśnij Ctrl Zamiast tego S . (Jeśli Ctrl S nie działa w ten sposób, prawdopodobnie oznacza to, że musisz wyłączyć kontrolę przepływu XON / XOFF: aby to zrobić, uruchom stty -ixon
.)
Jest to udokumentowane w sekcji „Wyszukiwanie” w man bash
.
Komentarze
-
Ctrl-Q
, aby wyjść ze stanu zamrożenia, jeśli już trafiłeśCtrl-S
bez wcześniejszego wyłączania sterowania przepływem i zablokowanie terminala.
Odpowiedz
Umieść je w swoim ~/.inputrc
:
"\e[5~": history-search-backward "\e[6~": history-search-forward
Dzięki temu Page Up i Page Down zachowuj się tak, jak chcesz (niektóre dystrybucje mają już skonfigurowane dla ciebie). Osobiście uważam to za wygodniejsze niż Ctrl + R lub history
.
Komentarze
- To najwygodniejszy sposób we wszystkich aktualnych odpowiedziach. u plz daj trochę wyjaśnienie mechanizmu działania?
-
~/.inputrc
lub/etc/inputrc
lub plik, do którego odwołuje się zmienna środowiskowa$INPUTRC
to plik konfiguracyjny edycji linii wszystkich aplikacji używających readline, w tym bash (twoja powłoka). Ma pewne wbudowane możliwości edycji wierszy, w tym te dwa: na stronie podręcznika bash ' wyszukaj jedno z tych słów kluczowych, aby dowiedzieć się więcej.\e[5~
/\e[6~
to sekwencje specjalne generowane przez klawisze Page Up / Down w większości emulatorów terminala; aby go zobaczyć, uruchom poleceniecat
, a następnie naciśnij te klawisze (bajt zmiany znaczenia jest reprezentowany w terminalu jako^[
, w inputrc jako\e
). - Przykład w Twoim pierwotnym pytaniu mówi, że klawisze Góra / Dół działają w ten sposób w Matlabie. Byłoby interesujące zobaczyć, co się stało, gdybyś umieścił sekwencję Up i Down w inputrc i przypisał do tej akcji; czy działałby poprawnie, czy miałby nieprzyjemne skutki uboczne, ponieważ koliduje z ich domyślnym zachowaniem. Nie ' wiem, ' z przyjemnością wysłucham twoich ustaleń, jeśli będziesz z tym eksperymentować.
- Kiedy robię
echo $INPUTRC
, jest pusty. ' korzystam z Ubuntu 14.04 - Osobiście wolę zastąpić strzałkę w górę i w dół, aby to zrobić:
"\e[A": history-search-backward
i"\e[B": history-search-forward
Odpowiedź
Oprócz historii ^ r / ^ s i -search:
alt . wstawia ostatnie „słowo” poprzedniego polecenia w miejscu kursora. Powtórz to, aby uzyskać ostatnie słowo ze starszych poleceń. (Pamiętaj jednak, że końcowe &
liczy się jako ostatnie słowo poleceń w tle).
Jest to bardzo przydatne w przypadku mkdir foo
, cd
alt-dot. Nawet szybciej niż strzałka w górę, ^ a, alt-d (usuń słowo z przodu), cd
.
Aby uzyskać przedostatnie słowo, użyj esc
-
2
alt+.
(tj. użyj argumentu numerycznego w stylu emacs do alt+.
.Ujemne liczy się od końca, dodatnie liczy się do przodu od początku.) Ale zwykle jest to bardziej kłopotliwe niż warte; w pewnym momencie szybsze jest sięgnięcie po mysz i kopiowanie / wklejanie lub strzałka w górę i ^ w / ^ y jego część (patrz poniżej).
Jeśli twój terminal jest ustawiony ładnie / poprawnie, ctrl-left i ctrl-right przejdą do tyłu / do przodu według słów. Jeśli nie, miejmy nadzieję, że przynajmniej alt-b i alt-f zrobią to samo.
ctrl- / jest cofnięciem. Możesz użyć automatycznego powtarzania do usuwania słów o wiele skuteczniej, jeśli możesz cofnąć, gdy trochę przekroczysz.
Silniejsze mieszanie / dopasowywanie poleceń pochodzi z użycia pierścienia zabijania, który działa tak jak w Emacsie. ctrl-y, aby wkleić ostatnie ctrl-w / ctrl-u / ctrl-backspace / alt-d. alt-y, aby przełączać się między starszym, zabitym tekstem.
Wielokrotne ctrl-w lub cokolwiek w rzędzie powoduje wejście do kill-ring. Użyj lewej i prawej strzałki lub czegoś innego, aby podzielić wpis, jeśli chcesz usunąć dwie rzeczy i wkleić tylko jedną później.
Łącząc te wszystkie razem, możesz
- zacznij wpisywać polecenie
- ctrl-r, aby wrócić do starego polecenia i chwycić jego część za pomocą control-w lub podobnego.
- esc-r lub
alt+r
, aby przywrócić go do stanu sprzed usunięcia jego części. - alt- , aby przejść na koniec historii (tj. Strzałka w dół do końca), aby wrócić do polecenia, w którym byłeś.
Inne wskazówki dotyczące interaktywnego użytkowania:
Włącz shopt -s globstar
, aby móc wykonać **/*.c
(rekurencyjnie z bieżącym reż). Czasami przydaje się do użytku interaktywnego, ale zwykle find -name "*.c" -exec foo {} +
jest lepsze.
Jeśli piszesz skrypty bash, przydaje się shopt -s extglob
włączone także w twoich interaktywnych powłokach. Czasami znajdziesz zastosowanie dla rzeczy takich jak *.!(c|h)
, aby dopasować pliki, które się nie kończą z .c lub .h.
Znajdź aliasy, które lubisz dla ls -l
, less
i wszystkiego innego, co robisz dużo. (cp -i
, mv -i
i rm -I
są fajne. Nie wpadaj w nawyk w zależności od nich, aby zrobili selektywny rm. GNU rm „s -I pyta raz o wszystkie argumenty.)
Lubię alias m=less
(m jak „więcej”). Mam less
skonfigurowane z , i . powiązane z poprzednim / następnym plikiem (lesskey
). Domyślnie jest to sekwencja wielu naciśnięć klawiszy, której nie można używać z automatycznym powtarzaniem.
Lubię robić wszystko na ekranie GNU. Łatwiej mi śledzić numerowane okna ekranu niż ładowanie zakładek w Konsoli (lub jakimkolwiek innym emulatorze terminala, którego próbowałem). Jeśli jeszcze nie znasz screen
, naucz się tmux, ponieważ jest nowszy i mniej okrutny.
Aby uzyskać coś w rodzaju funkcji otwierania nowej powłoki za pomocą taki sam cwd jak inna powłoka, używam niestandardowego haka dla cd / pushd / popd, który pozwala mi cds 8
na cokolwiek dir, której używa moja powłoka w oknie ekranu 8. Działa to nawet dla powłok poza sesją screen, o ile istnieje tylko jedna sesja screen.
Komentarze
- Mój nie ' wydaje się być ” poprawnie skonfigurowany „. Wiele skrótów, które tu widzę, nie działa '. Używam standardowego terminala z Ubuntu 14.04. Jak mogę to skonfigurować?
- @JorgeeFG: Myślę, że działało dla mnie od razu po wyjęciu z pudełka z
gnome-terminal
w Ubuntu 14.04, zanim przełączyłem się na KDE. Odpowiednia opcja jest w ustawieniach terminala, przedrostek esc vs hig h-bit, a może inne ustawienia. Niektóre z nich nie ' nie działają idealnie dla mnie przez ssh. (np. ctrl lewy / prawy pobudza kod ucieczki dla klawisza strzałki, a otrzymuję5D
pojawiające się dosłownie)
Odpowiedź
Dodaj następujące wiersze do swojego ~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
Jest to podobne do odpowiedzi egmonta, ale zamiast używać Page Up i Page Down, używa sekwencji ucieczki dla strzałek w górę i w dół. W ten sposób jest znacznie wygodniejszy w użyciu na komputerze Mac.
Odpowiedź
Zawsze konfiguruję swoje komputery z dużym HISTSIZE , dzięki czemu zachowuje dłuższą listę historii, a także HISTTIMEFORMAT z wartością znacznika czasu, więc Widzę, kiedy polecenie zostało uruchomione.
export HISTSIZE=10000 export HISTTIMEFORMAT="%m/%d/%Y %T "
Odpowiedź
Zwykle używam metody łączenia history
polecenie z grep
IE:
history | grep <command im looking for>
Spowoduje to wyświetlenie numerowanej historii poleceń, które wpisałeś, które zawierają to polecenie. Możesz następnie użyć:
!<number listed in history command>
, aby powtórzyć to polecenie.
IE:
history | grep history
142 history 143 history | grep lvresize 568 history | grep echo 570 history | grep echo 571 history | grep history
a następnie: !571
powtórzy się history | grep history
Komentarze
- CR = znacznie lepiej + dużo bezpieczniej
- Być może osobiście uważam, że historia jest przesyłana do grepa jako szybszy sposób znajdowania większości poleceń. Jeśli chodzi o bezpieczniejsze, ' nie jestem pewien, co masz na myśli, jakie są nieodłączne zagrożenia związane z używaniem historii w połączeniu z przeszukiwaniem jej za pomocą cR?
- @ Sos Podejrzewam, że PSkocik oznacza, że
!
zastępowanie historii jest mniej bezpieczne. - @Gravy Ryzyko nieodłączne polegałoby na przypadkowym wyświetleniu niewłaściwej linii. Nie mam pojęcia, dlaczego twój terminal się zawiesił, chyba że użyłeś Control-S i masz włączoną kontrolę przepływu xon / xoff (często domyślnie). Jeśli tak, Control-Q przywróci to.
- Zgadzam się z @PSkocik, cr jest dużo lepszy, ponieważ ' s łatwiej jest edytować wiersz historii, zamiast po prostu uruchamiać go ponownie w ten sam sposób. Ponowne uruchomienie dokładnie tego samego polecenia jest trywialnym przypadkiem tego, co można zrobić, aby zaoszczędzić czas na ponownym wpisywaniu odmian złożonych jednolinijkowych lub uzupełnianiu innego pliku w długiej ścieżce za pomocą tabulacji. Zobacz moją odpowiedź.
Odpowiedź
Codziennie korzystałem z 4 wskazówek (i kilku innych) w moim terminalu bash:
-
Wykonaj ostatnie polecenie:
!!
-
Wykonaj polecenie N z historii:
!N
-
Wydrukuj ostatnie polecenie zaczynające się od prefiks z historii:
!prefix:p
-
Wykonaj ostatnie polecenie zaczynając od prefiks z historii:
!prefix
Komentarze
- Myślę, że użycie polecenia N z historii jest jednym z najwspanialsze sposoby strzelania sobie w stopę dla większości ludzi 🙂 Po prostu mówiąc
Odpowiedz
Jeśli Możesz użyć zsh
zamiast bash
, możesz użyć oh-mi-zsh za to.
Możesz poruszać się po historii poleceń za pomocą strzałek w górę iw dół. Pozwala także na tę samą nawigację, gdy już wpisałeś tekst (jak w Mathlab).
edit: Oh-my-zsh to duży pakiet oprogramowania przeznaczony dla programistów, który zawiera wiele innych funkcji, np aliasy, motywy, wtyczki. Te dodatki czynią dystrybucję bardziej skomplikowaną w użyciu niż użycie skrótu klawiaturowego.
https://github.com/robbyrussell/oh-my-zsh
Komentarze
-
oh-my-zsh
zawiera mnóstwo rzeczy. Równie dobrze możesz powiedzieć: ta dokładna funkcja jest zawarta w tej dystrybucji, gdy wszystko, czego potrzebujesz, to określone ustawienie lub aplikacja. - Edytowałem post: ostrzegłem, że jest większy niż prosta aplikacja.
Odpowiedź
Dodaj następujący alias do ~ / .bashrc
alias h="history | awk """""{$1="";print}""""" |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep"
Użycie: h fire
wyświetli listę poleceń zawierających fire . lub h ^fire
wyświetli listę poleceń zaczynającą się od fire .
Jest to przydatne, gdy chcę wyświetlić serię poleceń w tym samym czasie.
Nawiasem mówiąc, """""
jest brzydki, ale nie mogłem znaleźć innych sposobów na uniknięcie pojedynczych cudzysłowów w apostrofach.
Komentarze
- fyi –
h="history | awk '{\$1=\"\"; print}'
powinno działać. Alternatywnie utwórz funkcję i wywołaj ją. - dziękuję DarkHeart, ale próbowałem twojego kodu, okazało się, że nie działa w moim środowisku, może jest coś innego w moim
fish
😉\e[5~
i\e[6~
, użyj\e[A
,\e[B
.