Suchen Sie nach einem vorherigen Befehl mit demselben Präfix, wenn Sie an einer Shell-Eingabeaufforderung die Nach-Oben-Taste drücken

19

Aus einer FreeBSD-Welt kommend möchte ich das Linux-Terminal wie FreeBSD verhalten lassen, insbesondere die 9.1-Version. Wenn Sie cddas Terminal eingeben und den Aufwärtspfeil drücken, können Sie alle Befehle im Verlauf durchsuchen, beginnend mit cddenen Sie beginnen viel Zeit gewinnen.

Ich weiß nicht, wie ich diese Funktion in Linux Debian oder CentOS aktivieren soll, was mich zwingt, das Ganze zu tippen. Könnte mir jemand helfen?

Abdelilah Benaou
quelle
7
Das ist eine Funktion der Shell, nicht des Terminals. Welche Shell benutzt du in FreeBSD? Möglicherweise können Sie dieselbe (oder eine ähnliche) Shell für Linux erhalten.
cjm
Ich benutze die tcsh-Shell.
Abdelilah Benaou
2
Ich benutze tcsh unter OS X und hatte dieses praktisch aussehende Verhalten nicht ... Nach einigem Suchen stellte ich fest, dass ich es aktivieren konnte, indem ich bindkey -k (up|down) history-search-(back|for)wardmein .tcshrc wie hier beschrieben einfügte . Cool!
Garrett Albright

Antworten:

34

Fügen Sie Folgendes hinzu, um ~/.inputrc:

# Press up-arrow for previous matching command
"\e[A":history-search-backward
# Press down-arrow for next matching command
"\e[B":history-search-forward

Erläuterung

~/.inputrcist die Konfigurationsdatei für GNU readline . Viele Shells, einschließlich bashund tcshverwenden readline zum Bearbeiten der Befehlszeile. In den beiden obigen Zeilen wird readline angewiesen, die Verlaufssuchfunktion aufzurufen, wenn die Escape-Sequenzen für die Aufwärtspfeiltaste ( \e[A) und die Abwärtspfeiltaste ( \e[B) gefunden werden.

Thomas Nyman
quelle
Ich mag es , F12 hinzuzufügen , um das letzte Wort der letzten Zeile auf das Ende des aktuellen Befehls zu setzen. Last wordist oft ein Weg, den ich in verschiedenen arkanen Klischees ausprobieren möchte. Und Shift F12 , um mich von Anfang an wieder dazu zu bringen, die gesamte letzte Zeile zu bearbeiten. ~/.inputrcist ein handliches Werkzeug.
8.
Die Umschalttaste F12 erfordert den vi-Modus .
8.
6

Was passiert ist, dass FreeBSD und Linux standardmäßig unterschiedliche Shells verwenden. FreeBSD verwendet standardmäßig tcsh , das in der Vergangenheit bessere interaktive Funktionen als bash hatte (aber bash hat aufgeholt), aber deutlich schlechtere Skriptfunktionen .

Der einfachste Weg, die gewohnte Umgebung zu finden, besteht darin, die Shell unter Linux auf tcsh umzustellen. Vorausgesetzt, dass tcsh systemweit installiert ist (falls dies nicht der Fall ist, bitten Sie Ihren Systemadministrator, es zu installieren), führen chsh -s tcshSie den Befehl aus, um Ihre Standard-Shell zu ändern.

Alternativ können Sie bash so einrichten, dass Sie diesen Befehl gewohnt sind. Standardmäßig ist die Upund Downnavigieren Pfeile unter allen Befehlen in der Geschichte, nicht nur diejenigen , die mit dem Präfix beginnen Sie eingegeben haben. Um dies in das gewohnte Verhalten zu ändern, fügen Sie die folgenden Zeilen in die Initialisierungsdatei von bash ein, die sich .bashrcin Ihrem Home-Verzeichnis befindet. Führen Sie . ~/.bashrceine neue Shell aus oder starten Sie sie, um die Initialisierungsdatei erneut zu lesen.

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

Die Escape-Sequenzen werden von Ihrem Terminal an die Shell gesendet, wenn Sie eine Pfeiltaste drücken. Upkann \eOA(Flucht, O, A) oder \e[Aje nach Endgerät und in ähnlicher Weise für Down.

Standardmäßig bietet bash verschiedene Tastenkombinationen zum Durchsuchen des Befehlsverlaufs. Sie können Ctrl+ drücken Rund dann einige Zeichen eingeben, um irgendwo in der Zeile nach einem Befehl zu suchen, der diese Teilzeichenfolge enthält. Drücken Sie Ctrl+ S, um vorwärts statt rückwärts zu gehen. Die Suche erfolgt inkrementell (dh während der Eingabe). Alt+ Pund Alt+ Ngeben Ihnen eine nicht inkrementelle Suche.

Anstelle von bash und tcsh können Sie auch zu zsh wechseln, das einige nette Funktionen bietet, die in anderen Shells nicht zu finden sind . Zsh hat standardmäßig Ctrl+ Rund Ctrl+ Sgenau wie bash. Um zu erhalten Upund Downwie Sie es in tcsh getan haben, geben Sie die folgenden Zeilen ein ~/.zshrc:

bindkey '\eOA' history-beginning-search-backward
bindkey '\e[A' history-beginning-search-backward
bindkey '\eOB' history-beginning-search-forward
bindkey '\e[B' history-beginning-search-forward

Wenn Sie überall dieselbe Shell verwenden möchten, können Sie bash oder zsh auch unter FreeBSD verwenden, sofern der Port installiert ist (fragen Sie erneut Ihren Systemadministrator).

Gilles 'SO - hör auf böse zu sein'
quelle
1

tcshist für die meisten Linux-Distributionen verfügbar. Versuchen Sie, das tcshPaket zu installieren , und führen Sie es dann aus chsh -s /bin/tcsh, um es zu Ihrer Standard-Shell zu machen.

cjm
quelle
1
Oder Sie könnten erwägen, auf bash umzusteigen (ich habe es getan).
Keith Thompson
1

Andere Antworten behandeln es, aber wenn Sie mehr wollen, schauen Sie sich https://github.com/zsh-users/zsh-history-substring-search an

Prezto ( https://github.com/sorin-ionescu/prezto ) ist auch voll von zsh-Leckereien.

Fuad Saud
quelle
Vielen Dank für Ihre Antwort, übrigens sehe ich immer noch nicht, welche Vorteile zsh gegenüber bash oder tcsh haben?
Abdelilah Benaou
1
Hum, Sie können so ziemlich alle grundlegenden Dinge in all diesen Muscheln tun. Ich benutze zsh wegen des ziemlich gut gepflegten prezto-Bundles (wahrscheinlich der große Game-Changer), der richtigen Eingabeaufforderung (was ein exklusives Feature ist) und weil es sich mehr poliert anfühlt als bash (consiguration und so).
Fuad Saud