Bash-Verlaufssuche, teilweise + Pfeil nach oben

146

Ich habe gesucht, aber nichts gefunden. Ich suche eine Funktionalität in Bash, mit einem Terminal.

Vor langer Zeit hatte ich einen Benutzer auf einem Debian-System und ein Freund richtete mich mit einer praktischen Verlaufssuchfunktion ein (ich glaube, ich habe damals tcsh verwendet), bei der ich den Anfang eines vorherigen Befehls eintippte. und es würde eine Suche basierend auf der Teilzeichenfolge durchführen.

ZB wenn meine Geschichte ist:

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

Und ich schreibe ., und drücken Sie Pfeil nach oben, würde es mir zeigen: ./script.pl arg1. Drücke es erneut und es würde sich zeigen ./script.pl, etc.

Sehr gerne würde es eine grepauf .bash_history durchführen. Gibt es eine Möglichkeit, diese Funktionalität zu erhalten?

TLP
quelle
mögliches Duplikat von iPython Like Command History für Shell
Marcel Stimberg
1
@Marcel Sieht so aus, als wäre es die gleiche Antwort, die ich bei der Suche gesehen habe, die ich aber nicht mit meiner Frage verbunden habe, mit den Schlüsselwörtern iPython und Shell.
TLP

Antworten:

197

Fügen Sie folgende Zeilen ein ~/.inputrc:

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

Zeilen, die mit beginnen, #sind Kommentare. Ich kann mich nicht erinnern, was rückwärts und was vorwärts ist. Experimentiere damit. Möglicherweise müssen Sie vorwärts und rückwärts schalten.


Ein bisschen Hintergrundinformation:

Bash verwendet readline , um die Eingabeaufforderung zu verarbeiten. ~/.inputrcist die Konfigurationsdatei für readline. Beachten Sie, dass dies auch in anderer Software, die die readline-Bibliothek verwendet, z. B. IPython , wirksam wird .

Weitere Informationen zu readline finden Sie im bash-Handbuch . Dort finden Sie auch weitere geschichtsbezogene Readline-Befehle .

So rufen Sie die Escape-Codes für die Pfeiltasten ab:

  1. Starten Sie catin einem Terminal (nur catkeine weiteren Argumente).
  2. Geben Sie die Tasten auf der Tastatur ein und Sie erhalten Dinge wie ^[[Afür den Aufwärtspfeil und ^[[Bden Abwärtspfeil.
  3. Ersetzen ^[durch \e.
Lesmana
quelle
1
Großartig, aber diese Lösung deaktiviert die Tastenkombinationen Strg-Links / Strg-Rechts.
Eyal
Kann mir jemand sagen, wie ich das gleiche für make
Hitesh Kumar
@lesmana, ich würde zusätzliche Punkte für den Katzenteil allein geben
Mike D
Hat jemand, der @Eyal unterstützt, Ratschläge dazu, wie ich das tun kann, aber die Tastenkombinationen Strg-Links / Strg-Rechts beibehalten?
Kbrose
6
Um alle Standardeinstellungen beizubehalten $include /etc/inputrc, fügen Sie vorzugsweise die erste Zeile hinzu.
Tulio Casagrande
31

Erstellen Sie eine Datei mit dem Namen setup_readline.sh im Modus 644 in /etc/profile.d/ mit folgendem Inhalt, melden Sie sich an und überprüfen Sie Ihre bevorzugten Schlüssel:

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

Ich denke, das ist der beste Weg, dies zu tun. Meistens, wenn Sie Konfigurationsmanagementsysteme wie Chefkoch, Marionette usw. Verwenden

Und Systemkonfiguration noch unberührt!

user287613
quelle
4
Seltsamerweise hat ~ / inputrc bei mir nicht funktioniert - aber diese Befehle in .bash_profile abgelegt.
Joe
1
.inputrc existiert nicht in meinem Home-Ordner und ich bevorzuge sowieso diese Art von Einstellungen in .bashrc, damit ich nur eine Datei für meine Einstellungen mitnehmen kann. Das ist also wahrscheinlich eine bessere Antwort als eine akzeptierte.
Shital Shah
.inputrc funktioniert fabelhaft für mich, aber nicht, nachdem ich geladen habe screen. Das Seltsame ist, dass andere .inputrc-Verknüpfungen funktionieren, aber nicht diese. Deshalb verwende ich jetzt beide Lösungen.
Orwellophile
Dies ist sehr hilfreich, wenn Sie sich zum Beispiel bei einem Server anmelden, um bestimmte Dinge zu erledigen, und wenn Sie nicht möchten, dass ~ / .inputrc auf dem Server bearbeitet und erneut geladen wird.
Danmactough
13

Strg + R gibt Ihnen diese Art von Funktionalität. Beginnen Sie mit der Eingabe eines Teilbefehls, und es werden alte Befehle angezeigt, die Sie mit den Aufwärts- und Abwärtspfeilen navigieren können. Weitere Informationen: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell

Andrew Moss
quelle
2
Danke für deine Antwort. Ja, das habe ich versucht, aber ich finde es ein bisschen ... pingelig. Es erlaubt mir nicht, durch Befehle zu scrollen, die mit dem Teil beginnen, es zeigt nur den ersten. Es durchsucht auch den gesamten Befehl nach dem Charakter, was irgendwie nutzlos ist.
TLP
5
@ TLP, wiederholen schlagenCtrl+r
akostadinov
4

Um die Antwort von Lesmana in Bezug auf "~ / .inputrc", die ich unter Trusty 14.04 erstellen soll, zu vervollständigen, verifizieren Sie "~ / .bashrc" (die erste Zeile ist bereits in meinem "~ / .bashrc" vorhanden):

shopt -s histappend  
PROMPT_COMMAND='history -a'  

Es ist bereits in Französisch in https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique erklärt .

bcag2
quelle
2
Dieser Befehl weist bash grundsätzlich an, den Befehl sofort an die Verlaufsdatei anzuhängen, anstatt auf das Ende der Sitzung zu warten. Es ist nützlich, wenn Sie viele Terminals geöffnet haben und die Geschichte nicht in einem verlieren möchten, ansonsten aber nicht erforderlich. digitalocean.com/community/tutorials/…
Shital Shah
3

Vielleicht möchten Sie https://github.com/dvorka/hstr ausprobieren, das eine einfache und mehrzeilige Filterung des Bash-Verlaufs bietet, die auf Metriken basiert (wann, wie oft und wie lange von Befehlen abhängt) - die Sie verwenden können Pfeiltasten zum einfachen Navigieren im Verlauf:

Bildbeschreibung hier eingeben

Es kann leicht sein gebunden an Ctrl-rund / oderCtrl-s

Martin Dvorak
quelle
0

Die folgende Lösung kombiniert und erweitert einige der oben genannten Ansätze: Fügen Sie Ihrer ~/.bash_aliasesDatei die folgenden Zeilen hinzu (dies ist nicht erforderlich ~/.inputrc), um das folgende Verhalten zu erzielen:

  1. Bewegen Sie sich im Verlauf nach oben / unten (nur Einträge mit demselben Präfix), indem Sie STRG + NACH OBEN und STRG + NACH UNTEN drücken. Dies kann neben der Standardfunktionalität des Aufwärts- / Abwärtsbewegens in der gesamten Historie allein über UP und DOWN existieren
  2. Zum nächsten / vorherigen Wort in einer Befehlszeile springen, indem Sie STRG + RECHTS und STRG + LINKS drücken
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'

Melden Sie sich erneut bei der Shell an (oder führen Sie sie aus source ./bash_aliases), um die Änderungen zu übernehmen.

user27164
quelle