Wyszukaj poprzednie polecenie z przedrostkiem, który właśnie wpisałem

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

  • Możesz po prostu użyć powłoki, która zapewnia taką funkcję, na przykład fish😉
  • @yoann you ' ponownie zakładając, że bash nie ' t . Tak, przez readline, po prostu domyślnie niedostępne.
  • @muru I ' jestem świadomy CTRL + R w bash i egmont ' Odpowiedź zapewnia zgrabny sposób na zrobienie tego za pomocą Page Up / Page Down. Czy jest jednak sposób, aby to zrobić za pomocą klawiszy strzałek?
  • @yoann sprawdź unix.stackexchange.com/a/76591/70524. Zamiast \e[5~ i \e[6~, użyj \e[A, \e[B.

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 polecenie cat, 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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *