Wie kann ich in BASH die Rückwärtssuche durchlaufen?

443

Im Terminal kann ich CTRL-Reingeben, um nach einem passenden Befehl zu suchen, der zuvor in BASH eingegeben wurde. Wenn ich zum Beispiel, geben Sie CTRL-Rdann grepist Listen mein letzter grepBefehl, und ich kann drücken Sie die Eingabetaste , es zu benutzen. Dies ist jedoch nur ein Vorschlag. Gibt es eine Möglichkeit, andere zuvor eingegebene Übereinstimmungsbefehle durchzugehen?

Dorf
quelle

Antworten:

596

Wenn ich die Frage richtig verstehe, sollten Sie in der Lage sein, durch wiederholtes Schlagen durch Alternativen zu blättern Ctrl+R.

Z.B:

Ctrl+R grep Ctrl+R Ctrl+R ...

Das durchsucht rückwärts Ihre Geschichte. Um stattdessen vorwärts zu suchen, verwenden Sie Ctrl+S, aber möglicherweise müssen Sie zuvor Folgendes festlegen stty -ixon(entweder per .bash_profileoder manuell), um die übernehmende XON / XOFF-Funktion zu deaktivieren Ctrl+s. (Weitere Details hier .)

Runium
quelle
23
+1 - Zu Ihrer Information - Sie können auch nach dieser StackOverflow-Antwort vorwärts suchen .
Jordan Arseno
7
Und verwenden Sie Strg + Umschalt + r, um rückwärts zu scrollen, wenn Sie übergehen.
wiswit
19
@wiswit CTRL+SHIFT+rfunktioniert bei mir nicht.
Maxim Suslov
9
@MaximSuslov Siehe diese Frage: stackoverflow.com/questions/791765/… Sie können [[ $- == *i* ]] && stty -ixonzu Ihrer .bashrc- Datei hinzufügen und arbeiten dann CTRL+swie die Rückseite vonCTRL+r
gla3dr
9
@JordanArseno Ich nahm "Suche vorwärts" zu bedeuten "Suche nach Befehlen, die ich noch nicht eingegeben habe"
Josh Johnson
234

Wenn Sie der Meinung sind, dass der Befehl häufig verwendet wird, können Sie ein Tag hinzufügen

Befehl #nützlich

Dann

ctrl+r #useful

Dies funktioniert, weil #es sich um ein Kommentar-Trennzeichen handelt, dh alles, was nach dem Symbol kommt, wird nicht als Befehl interpretiert. Es wird jedoch in der Historie aufgezeichnet und ist somit durchsuchbar.

Sathyam
quelle
5
Normalerweise mag ich diese Art des Markierens. #trg_bld #open_log
Makesh
1
Wo soll dieser Tag hinzugefügt werden?
Sudip Bhandari
5
@SudipBhandari direkt nach Ihrem Befehl. # startet einen Kommentar. ZB ls -lah #useful
Andrei
47

Sie können auch die Aufwärts- und Abwärtspfeile einstellen, um eine etwas andere Suche durchzuführen, indem Sie diese Zeilen zu ~ / .inputrc hinzufügen:

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

Anstatt irgendwo im Befehl nach einer Teilzeichenfolge zu suchen (wie Ctrl-r ), wird nach einem Befehl gesucht, der mit dem Text links vom Cursor beginnt . Wenn ich zum Beispiel folgende Befehle ausführe:

$ ls bart
$ ls fools

Geben Sie dann ein lsund drücken Sie Upzweimal, es wird ls bartund der Cursor an derselben Stelle angezeigt. Vergleichen Sie mit Ctrl- r, wo es das lsDoppelte in der letzten Zeile finden würde, also müssten Sie es noch einmal drücken, um die vorherige Zeile zu finden.

Beide Ansätze haben ihre Stärken und können viel Zeit sparen.

l0b0
quelle
2
Dies ist auch unter OS X Standard, sodass Sie ~/.inputrcdiese beiden Zeilen nicht erstellen und hinzufügen müssen.
DASKAjA
1
Wie Falconepi in den Kommentaren zu dieser Antwort geschrieben hat , müssen Sie bei Ubuntu nur ~/.inputrcdie beiden Zeilen einschließlich der History-Suche *
Arpad Horvath,
Sie können auch in diesem Beitrag nach weiteren Details zu dieser Antwort suchen
Andrei
Dies war auf meinem macOS (10.13) nicht Standard. Ich habe diese Funktionalität immer vermisst!
Forthrin
Eine gute Sache dabei ist, dass Sie immer noch Strg-P ​​/ Strg-N verwenden können, um regelmäßig durch den Verlauf zu
blättern
0

Es gibt einen Ersatz für eingebaute Ctrl + Rnamens hstr . Sie können den Befehlsverlauf nach allen Suchtoken gleichzeitig durchsuchen (unter anderem) und mit den Pfeiltasten durch die Ergebnisse blättern:

Beispiel

Hier ist ein Demo-Screencast .

Es kann auf einem Betriebssystem der Debian-Familie wie folgt installiert werden:

add-apt-repository ppa:ultradvorka/ppa
apt-get update
apt-get install hstr

hstr --show-configuration >> ~/.bashrc

Und dann verwenden Ctrl + R(nach dem erneuten Öffnen des Terminals).

saaj
quelle