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?

TLP
źródło
możliwy duplikat iPython Like Command History For Shell
Marcel Stimberg
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.
lesmana
źródło
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!

użytkownik 287613
źródło
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

Andrew Moss
źródło
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 .

bcag2
źródło
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

Martin Dvorak
źródło
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.

użytkownik27164
źródło