Wyszukiwanie historii Bash, częściowa + strzałka w górę


146

Szukałem, ale nie znalazłem nic na ten temat. Szukam funkcjonalności w bash, używając terminala.

Dawno temu, kiedy miałem użytkownika w systemie Debian, a znajomy skonfigurował mnie z wygodną funkcją wyszukiwania historii (myślę, że wtedy użyłem tcsh), gdzie wpisałbym początek poprzedniego polecenia, strzałkę w górę, i wykonałby wyszukiwanie na podstawie ciągu częściowego.

Np. Jeśli moja historia to:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

I typ ., a następnie naciśnij przycisk strzałki w górę, to mi pokazać: ./script.pl arg1. Naciśnij ponownie, aby wyświetlić ./script.plitd.

Bardzo, jakby to zrobił grep.hash_history. Czy istnieje sposób na uzyskanie tej funkcjonalności?



1
@Marcel Wygląda na to, że może to być ta sama odpowiedź, widziałem to podczas wyszukiwania, ale nie połączyłem jej z moim pytaniem za pomocą słów kluczowych iPython i Shell.
— TLP

Odpowiedzi:


197

Umieść następujące wiersze w swoim ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

Linie zaczynające się od #są komentarzami. Nie pamiętam, co jest do tyłu, a co do przodu. Eksperymentuj z tym. Może musisz przełączać się do tyłu i do przodu.


Trochę informacji w tle:

Bash używa readline do obsługi pytania. ~/.inputrcto plik konfiguracyjny dla readline. Pamiętaj, że będzie to również miało zastosowanie w innym oprogramowaniu korzystającym z biblioteki readline, na przykład IPython .

Przeczytaj instrukcję bash, aby uzyskać więcej informacji o readline. Tam możesz także znaleźć więcej poleceń readline związanych z historią .

Aby uzyskać kody ucieczki dla klawiszy strzałek, możesz wykonać następujące czynności:

  1. Rozpocznij catw terminalu (tylko catbez dalszych argumentów).
  2. Wpisz klawisze na klawiaturze, otrzymasz rzeczy takie jak ^[[Astrzałka w górę i strzałka ^[[Bw dół.
  3. Wymień ^[się \e.

1
Świetnie, ale to rozwiązanie wyłącza skróty ctrl-lewy / ctrl-prawy.
— Eyal

Czy ktoś może mi powiedzieć, jak mogę osiągnąć to samo w przypadku make
— Hitesh Kumar

@lesmana, dałbym dodatkowe punkty za samą część kota
— Mike D

Wdrażając @Eyal, ktoś ma porady, jak mogę to zrobić, ale zachowaj skróty ctrl-left / ctrl-right?
— kbrose

6
Aby zachować wszystkie wartości domyślne, dodaj $include /etc/inputrc, najlepiej w pierwszym wierszu.
— Tulio Casagrande,

31

Utwórz plik o nazwie setup_readline.sh w trybie 644 w /etc/profile.d/ z następującą zawartością, zaloguj się i sprawdź preferowane klucze:

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

Myślę, że to najlepszy sposób, aby to zrobić. Głównie, jeśli używasz systemów zarządzania konfiguracją, takich jak szef kuchni, marionetka itp

I konfiguracja systemu nadal nietknięta!


4
Dziwne, że ~ / inputrc nie działało dla mnie - ale umieszczenie tych poleceń w .bash_profile zadziałało.
— Joe

1
Plik .inputrc nie istnieje w moim folderze domowym i i tak wolę mieć takie ustawienia w .bashrc, więc mogę po prostu przenieść jeden plik dla moich ustawień. Jest to więc prawdopodobnie lepsza odpowiedź niż zaakceptowana.
— Shital Shah

.inputrc działa dla mnie bajecznie, ale nie po załadowaniu screen. Dziwne jest to, że działają inne skróty .inputrc, ale nie te. Więc teraz używam obu rozwiązań.
— Orwellophile

Jest to bardzo pomocne, gdy na przykład logujesz się na serwerze, aby robić różne rzeczy i brakuje im cholerstwa, a nie chcesz edytować i ponownie ładować ~ / .inputrc na serwerze.
— danmactough,

13

Ctrl + R daje taką funkcjonalność. Zacznij wpisywać częściowe polecenie, a pojawią się stare, którymi możesz poruszać się za pomocą strzałek w górę i w dół. Więcej informacji: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell


2
Dzięki za odpowiedź. Tak, próbowałem tego, ale uważam to za trochę ... wybredne. Nie pozwoli mi przewijać poleceń zaczynających się od częściowego, pokazuje tylko pierwsze. Przeszukuje również całe polecenie w poszukiwaniu znaku, co jest w pewnym sensie bezużyteczne.
— TLP

5
@TLP, powtórz uderzenieCtrl+r
— akostadinov

4

Aby wypełnić odpowiedź lesmana dotyczącą „~ / .inputrc”, którą powinienem utworzyć pod moim Trusty 14.04, sprawdź / dodaj w „~ / .bashrc” (pierwszy wiersz już istnieje w moim „~ / .bashrc”):

shopt -s histappend  
PROMPT_COMMAND='history -a'  

Jest to już wyjaśnione w języku francuskim w https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique .


2
To polecenie w zasadzie nakazuje bashowi natychmiastowe dołączenie polecenia do pliku historii zamiast oczekiwania na zakończenie sesji. Jest to przydatne, jeśli masz wiele otwartych terminali i nie chcesz stracić historii w jednym, ale w innym przypadku nie jest to konieczne. digitalocean.com/community/tutorials/...
— Shital Shah

3

Być może warto wypróbować https://github.com/dvorka/hstr, który zapewnia proste i wieloliniowe proste filtrowanie historii Bash, które oparte na danych (kiedy, jak często i długość poleceń ma znaczenie) - możesz użyć klawisze strzałek, aby łatwo poruszać się po historii:

wprowadź opis zdjęcia tutaj

Może być łatwo wiąże się Ctrl-ri / lubCtrl-s


0

Poniższe rozwiązanie łączy i rozszerza niektóre z wyżej wymienionych podejść: dodaj następujące wiersze do ~/.bash_aliasespliku (nie ma takiej potrzeby ~/.inputrc), aby osiągnąć następujące zachowanie:

  1. przesuń w górę / w dół w historii (tylko wpisy z tym samym prefiksem), naciskając CTRL + UP i CTRL + DOWN. Może to współistnieć ze standardową funkcjonalnością poruszania się w górę / w dół w całej historii za pomocą samych UP i DOWN
  2. przeskocz do następnego / poprzedniego słowa w linii poleceń, naciskając CTRL + PRAWO i CTRL + LEWO
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-word'
bind '"\e[1;5D":backward-word'

Zaloguj się ponownie do powłoki (lub uruchom source ./bash_aliases), aby zastosować zmiany.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.