Beste Möglichkeit, die Geschichte von Shell zu durchsuchen

78

Gibt es eine bessere Möglichkeit, meine Verlaufsdatei nach einem Befehl zu durchsuchen als grep? Ich habe eine Vorstellung davon, wie der Befehl beginnt, aber ich weiß nicht, wie weit er in der Vergangenheit zurückliegt.

update: war früher zsh-spezifisch, kann aber aufgrund überlappender Antworten jederzeit für eine Shell (oder einen Modus (vi / emacs)) beantwortet werden.

Xenoterracid
quelle

Antworten:

73

Ctrl+ Rist normalerweise der beste Weg, wie der Deskriptor sagte . Sie können auch verwenden !string, das den aktuellsten Befehl beginnend mit stringoder !?string?den aktuellsten Befehl ausführt, der enthält string.

(Ich denke, das ist das einzige, was für diese Frage relevant ist, aber ich habe in dieser Antwort viel mehr von den Verlaufsbefehlen behandelt. )

Michael Mrozek
quelle
4
Wie lässt du das "Strg + R" so aussehen?
Xenoterracide
13
@xen <kbd>Ctrl+R</kbd>. Antwortquelle
Michael Mrozek
Ich habe nicht bemerkt, dass SE Engine HTML akzeptiert. Danke.
Xenoterracide
Ich wusste nicht, dass das Schlüsselwort kbd "ctrl" und "+" korrekt interpretieren würde! Ich habe jeden Schlüssel einzeln markiert. Vielen Dank!
Olivier Dulac
2
@OlivierDulac Leider nicht, so habe ich Schlüssel formatiert. Jemand hat meine Antwort später bearbeitet , um die Schlüssel zu trennen
Michael Mrozek
30

Wenn Sie Bash verwenden, geben Sie Control- ein Rund beginnen Sie dann mit der Eingabe. Typing Control- Rimmer wieder nach einigem Text eingegeben werden Sie zurück in passenden Befehlszeilen bewegen.

grendel
quelle
18

Ich bin mir nicht sicher, ob dies helfen wird, aber ich verwende es gerne ctrl- rund beginne dann, den Befehl einzugeben. Es sollte durch Ihre Geschichte gehen und Sie mit dem ersten Match präsentieren. So wechseln Sie durch die Spiele einfach auf ctrl- rwieder.

Beschreiber
quelle
2
Sorry, habe die zsh vergessen. Möglicherweise müssen Sie diese Tastenkombination zu Ihrem ~ / .zshrc: Bindkey '^ R' hinzufügen. History-incremental-search-backward
decriptor
17

Wenn Sie Folgendes hinzufügen ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

Wenn Sie Bash neu starten, können Sie mit der Eingabe beginnen und dann mit Page Upund Page Downvorwärts und rückwärts durch den Verlauf der Zeilen navigieren, beginnend mit demselben Präfix, das Sie gerade eingegeben haben.

(Einige bevorzugen möglicherweise die Verwendung von \e[Aund \e[B, wodurch die normalen Upund DownAktionen ersetzt werden, anstatt neue Schlüssel zu binden.)

vergänglich
quelle
Ich bevorzuge es, diese Befehle auf Alt + Upund abzubilden Alt + Down. Abhängig von der Tastaturemulation, die das Terminalemulat verwendet, können diese Kombinationen entweder \E[Aund \E[A(z. B. KDE-Konsole mit Linux-Schlüsselbindungen) oder \E[1;3Aund \E[1;3B(z. B. XFCE-Terminal oder KDE-Konsole mit X Free 4-Bindungen) zugeordnet werden.
Christian Herenz
9

Die von Ctrl- aufgerufene interaktive Eingabeaufforderung R, die bereits erwähnt wurde, ist der bequemste Weg. Es ist zusätzlich populär neu zuzuordnen Upund den DownPfeiltasten die Geschichte für ein Präfix zur Zeit auf der Kommandozeile zu suchen, erfordert dies jedoch einige Änderungen an der ~/.inputrcDatei .

Die klassische und weniger interaktive Lösung ist die Verwendung der Shell-Verlaufserweiterung. Tippen

!foo

führt den letzten Befehl aus, der mit foound beginnt

!?foo

führt den letzten Befehl aus, der enthält foo. Weitere Informationen zur Verlaufserweiterung finden Sie im Bash-Referenzhandbuch , sofern Ihre Shell Bash oder kompatibel ist.

Adam Byrtek
quelle
6

Wenn Sie stty -ixonIhrer ~/.bashrcDatei hinzufügen , wird Ctrl- sin die entgegengesetzte Richtung zu Ctrl- gehen r.

Dennis Williamson
quelle
Ich wollte C-sfür diesen Zweck verwenden, aber mein Terminal wurde eingefroren ; in acht nehmen! (Nun, ich habe noch keine eingestellt stty ixon, nicht sicher, wofür das ist.)
imz - Ivan Zakharyaschev
3
@imz: C-qwird "auftauen". Dies und das C-ssind die üblichen Steuerzeichen für den Softwarefluss, die einst nützlich waren, um den Ausgabefluss manuell zu unterbrechen (anzuhalten), wenn langsame serielle Verbindungen verwendet wurden. Jetzt ist die Ausgabe in den meisten Fällen so schnell, dass das, was Sie sehen möchten, wenn Sie drücken, C-sbereits einen Bildlauf durchgeführt hat. stty -ixonSchaltet die Software-Flusskontrolle aus.
Dennis Williamson
Fantastisch! Ich habe jahrelang nach einer Möglichkeit gesucht, in der Geschichte so vorwärts zu scrollen.
Marlar
3

Wenn Sie tippen, !lsdurchsucht bash Ihren Verlauf und führt den letzten Befehl aus, der mit "ls" beginnt.

Kevin M
quelle
2

könnte zsh-spezifisch sein. Bei der Erforschung dieser Antwort ich gefunden vi-history-search-backward , die man mit Suche ermöglicht den Einsatz /in vi - Modus (die ich nicht , ich war in nicht erwähnt) , die Sie dann verwenden können , nund Njeweils vorwärts und rückwärts suchen (nach dem Pressen enter).

Xenoterracid
quelle
2

Ich bin überrascht, dass dies nicht erwähnt wurde - aber Sie können den vi-Modus in bash oder ksh folgendermaßen auswählen:

set -o vi

... oder als Inhalt von ~/.inputrc(für GNU-Readline, die in Programmen wie bash verwendet wird):

set editing-mode vi

Danach können Sie Escmit in den Befehlsmodus wechseln und mit kin den Verlauf zurückkehren und jvorwärts gehen. Sie können auch mit suchen /, um normal ?zu suchen und umgekehrt.

Wenn Sie verwenden ~/.inputrc, funktioniert dies nicht nur in GNU bash, sondern in allem, was GNU readline verwendet, wie z. B. CLISP und möglicherweise in Programmen wie der MySQL-Befehlsshell und der CPAN-Shell.

Mei
quelle
2

So schalten Sie bei Verwendung der Rückwärtssuche vorwärts (mit dem Befehl Strg-R):

  1. Öffnen Sie Ihre .bashrc-Datei:
    sudo gedit ~/.bashrc

  2. füge diese Zeile hinzu (der Buchstabe "f" kann durch einen anderen ersetzt werden, der noch nicht vom System verwendet wird)

    bind '"\C-f": forward-search-history' 
  3. Schließen Sie Ihre Datei und aktualisieren Sie Ihre .bashrc-Datei (oder öffnen Sie ein anderes Terminal) mit dem Befehl:
    source ~/.bashrcoder. ~/.bashrc

JETZT KÖNNEN SIE MIT DEM KURZSCHLAG IN DER GESCHICHTE VORWÄRTS SPRINGEN: STRG + F

Arbeiten an Ubuntu 18.04 LTS

Franklin TCHATATH
quelle
1

Die meiste Zeit benutze ich die folgenden zwei.
Beachten Sie jedoch, dass beide nach Startzeichen suchen.

  1. tcsh : Geben Sie einige Zeichen des Befehls ein, Esc+ pdann wird der vorherige Befehl angezeigt, beginnend mit dieser Tastenfolge. Wenn Sie erneut darauf drücken, wird ein weiterer Befehl angezeigt .
  2. ksh : Mit fc -e - <SPACE> <first few char for your previous >diesem Befehl wird der letzte Befehl ausgeführt, der dieser Sequenz entspricht.

Ich war so etwas wie finden nicht in der Lage Ctrl+ Rin Bash für meine ksh und tcsh.

Hemant
quelle
3
Strg + r funktioniert in ksh etwas anders als in Bash. Drücken Sie Strg + r, geben Sie die Zeichenfolge ein, nach der Sie suchen, und drücken Sie die Eingabetaste . Um nach dem gleichen Element zu suchen, drücken Sie Strg + r und geben Sie ein, ohne die Zeichenfolge erneut eingeben zu müssen. Dies ist set -o emacsübrigens im Modus.
Dennis Williamson
@ Tennis: +1 :-)
Hemant
1

Es gibt eine Möglichkeit Ctrl- Rmit tcsh . Fügen Sie Folgendes hinzu ~/.cshrc:

bindkey "^r" i-search-back (es ist nur ein Caret-Zeichen und der Buchstabe r)

Das ist die größte Zeitersparnis für mich.

große Nase
quelle
1

ähnliche Antwort auf @ephemient, aber Sie können in Ihrem .bashrc setzen

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

und geben Sie einen Teil des Ausdrucks ein, und verwenden Sie dann den Aufwärts- / Abwärtspfeil, um die neuesten Optionen zu durchsuchen, die übereinstimmen. Dies ist das Standardverhalten von matlab.

Für die meisten Leute, wenn Sie Ihre Einstellungen auf ein neues System portieren möchten, ist es einfacher, sich daran zu erinnern, nur an Ihrem ~/.bashrczu hängen, als an dem, dass Sie sich daran festhalten müssen~/.inputrc

Matt S.
quelle
0

Ja, zumindest wenn Sie zsh verwenden. Beginnen Sie einfach mit der Eingabe des Befehls und drücken Sie M-p( ESC p), um frühere Befehle zu finden, die Ihren Eingaben entsprechen. Drücken Sie erneut, um die nächste Übereinstimmung zu finden.

dkagedal
quelle
Diese Antwort kann mehr Erklärungen gebrauchen.
Phunehehe