Suchen Sie nach einem vorherigen Befehl mit dem Präfix, das ich gerade eingegeben habe.

Wir können den Aufwärts- und Abwärtspfeil verwenden, um im Befehlsverlauf zu navigieren.

In Bei einigen IDEs wie Matlab scrollen wir, wenn wir etwas eingeben und dann die Pfeiltasten drücken, nur zwischen den Verlaufsbefehlen, beginnend mit dem, was wir eingegeben haben. Das ist wirklich praktisch, aber in einem Shell-Terminal funktioniert das nicht.

Gibt es eine Möglichkeit, eine ähnliche Funktion in einem Shell-Terminal zu erhalten? Weitere Tipps zur Verbesserung der Effizienz bei der Terminalnutzung?

Kommentare

  • Sie können einfach eine Shell verwenden, die eine solche Funktion bietet, z. B. fish😉
  • @yoann Sie ‚ gehen davon aus, dass bash nicht ‚ t ist . Über readline ist dies standardmäßig nicht möglich.
  • @muru Ich ‚ kenne STRG + R in bash und egmont bietet eine gute Möglichkeit, dies mit Bild auf / Bild ab zu tun. Gibt es jedoch eine Möglichkeit, dies mit den Pfeiltasten zu tun?
  • @yoann check out unix.stackexchange.com/a/76591/70524. Verwenden Sie anstelle von \e[5~ und \e[6~ \e[A, \e[B.

Antwort

Was Sie suchen, ist Strg R .

Geben Sie Strg R ein und geben Sie dann einen Teil des gewünschten Befehls ein. Bash zeigt den ersten übereinstimmenden Befehl an. Geben Sie weiterhin Strg R ein, und bash durchläuft die vorherigen Übereinstimmungsbefehle.

Um im Verlauf rückwärts zu suchen, geben Sie Strg ein S stattdessen. (Wenn Strg S für Sie nicht so funktioniert, bedeutet dies wahrscheinlich, dass Sie die XON / XOFF-Flusssteuerung deaktivieren müssen: Führen Sie dazu stty -ixon.)

Dies ist unter „Suchen“ in man bash dokumentiert.

Kommentare

  • Ctrl-Q , um den eingefrorenen Zustand zu beenden, wenn Sie bereits ohne vorher die Flusskontrolle auszuschalten und Ihr Terminal einzufrieren.

Antwort

Platzieren Sie diese in Ihrem ~/.inputrc:

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

Diese machen Page Up und Bild ab verhält sich wie gewünscht. (Einige Distributionen haben es bereits für Sie konfiguriert.) Ich persönlich finde diesen Weg bequemer als Strg + R oder history.

Kommentare

  • Dies ist der bequemste Weg in allen aktuellen Antworten u plz geben ein wenig Erklärung zum Arbeitsmechanismus?
  • ~/.inputrc oder /etc/inputrc oder die Datei, auf die die Umgebungsvariable $INPUTRC ist die Konfigurationsdatei für die Zeilenbearbeitung aller Anwendungen, die readline verwenden, einschließlich bash (Ihre Shell). Es verfügt über bestimmte integrierte Funktionen zur Zeilenbearbeitung, einschließlich der beiden folgenden: In der manuellen Seite von bash ‚ suchen Sie nach einem dieser Schlüsselwörter, um mehr zu erfahren. \e[5~ / \e[6~ sind die Escape-Sequenzen, die von den Page Up / Down-Tasten in den meisten Terminalemulatoren generiert werden. Um dies zu sehen, starten Sie den Befehl cat und drücken Sie diese Tasten (das Escape-Byte wird im Terminal als ^[ in inputrc as dargestellt \e).
  • Das Beispiel in Ihrer ursprünglichen Frage besagt, dass die Auf- / Ab-Tasten in Matlab auf diese Weise funktionieren. Es wäre interessant zu sehen, was passiert ist, wenn Sie die Sequenz von Up und Down in inputrc platzieren und dieser Aktion zuweisen. würde es richtig funktionieren oder böse Nebenwirkungen haben, da es mit ihrem Standardverhalten in Konflikt steht. Ich weiß nicht, ‚, ich ‚ würde mich freuen, Ihre Ergebnisse zu hören, wenn Sie damit experimentieren.
  • Wenn ich echo $INPUTRC mache, ist es leer. Ich ‚ verwende Ubuntu 14.04
  • Ich persönlich bevorzuge es, den Aufwärts- und Abwärtspfeil zu überschreiben, um dies zu tun: "\e[A": history-search-backward und "\e[B": history-search-forward

Antwort

Neben der Geschichte von ^ r / ^ i -search:

alt . fügt das letzte „Wort“ des vorherigen Befehls am Cursor ein. Wiederholen Sie diesen Vorgang, um das letzte Wort aus älteren Befehlen zu erhalten. (Beachten Sie jedoch, dass ein abschließendes & als letztes Wort für Hintergrundbefehle gilt.)

Dies ist sehr praktisch für mkdir foo, cd Alt-Punkt. Noch schneller als der Aufwärtspfeil ^ a, alt-d (Vorwärtswort löschen), cd.

Verwenden Sie, um das vorletzte Wort zu erhalten esc - 2 alt+. (dh Verwenden Sie ein numerisches Argument im Emacs-Stil für alt+..Negative Zählungen zählen vom Ende an, Positive zählen von Anfang an vorwärts.) Dies ist jedoch normalerweise schwieriger als es sich lohnt. Irgendwann ist es schneller, nach der Maus zu greifen und sie zu kopieren / einfügen oder nach oben und ^ w / ^ y Teil davon (siehe unten).


Wenn Ihr Terminal gut / richtig eingerichtet ist, werden Strg-Links und Strg-Rechts mit Worten vorwärts / rückwärts gehen. Wenn nicht, tun hoffentlich mindestens alt-b und alt-f dasselbe.


Strg- / ist ein Rückgängigmachen. Sie können die automatische Wiederholung verwenden, um Wörter viel effizienter zu löschen, wenn Sie sie rückgängig machen können, wenn Sie ein wenig überschießen.


Ein leistungsfähigeres Mischen / Anpassen von Befehlen erfolgt durch Verwendung des Kill-Rings, der funktioniert genau wie in Emacs. Strg-Y, um die letzte Strg-W / Strg-U / Strg-Rücktaste / Alt-D einzufügen. Alt-Y, um durch älteren getöteten Text zu blättern.

Mehrere Strg-W oder was auch immer in einer Reihe bei der Eingabe des Kill-Rings. Verwenden Sie den Pfeil nach links und rechts oder etwas anderes, um den Eintrag aufzubrechen, wenn Sie zwei Elemente entfernen und erst eines später einfügen möchten.

Wenn Sie alle diese Elemente kombinieren, können Sie

  • Geben Sie einen Befehl
  • ctrl-r ein, um zu einem alten Befehl zurückzukehren und einen Teil davon mit control-w oder ähnlichem abzurufen.
  • esc-r oder alt+r, um den ursprünglichen Zustand wiederherzustellen, bevor Sie einen Teil davon gelöscht haben.
  • alt- >, um zum Ende des Verlaufs zu gelangen (dh den gesamten Weg nach unten), um zu dem Befehl zurückzukehren, in dem Sie sich gerade befanden.

Weitere Tipps zur interaktiven Verwendung:

Aktivieren Sie shopt -s globstar, damit Sie **/*.c ausführen können (rekursiv einschließlich des Stroms dir). Manchmal praktisch für den interaktiven Gebrauch, aber normalerweise ist find -name "*.c" -exec foo {} + besser.

Wenn Sie Bash-Skripte schreiben, ist es praktisch, ist auch in Ihren interaktiven Shells aktiviert. Manchmal finden Sie eine Verwendung für Dinge wie *.!(c|h), um Dateien abzugleichen, die nicht enden mit .c oder .h.

Finden Sie Aliase, die Sie für ls -l, less und alles andere, was Sie tun, mögen viel. (cp -i, mv -i und rm -I sind nett. Gewöhnen Sie sich nicht an von abhängig von ihnen, um eine selektive rm zu machen. GNU rm „s -I fragt einmal nach allen Argumenten.)

Ich mag alias m=less (m für „mehr“). Ich habe less mit , und eingerichtet. an vorherige / nächste Datei gebunden (lesskey). Die Standardeinstellung ist eine Multi-Keypress-Sequenz, die nicht mit Autorepeat verwendet werden kann.


Ich mache gerne alles innerhalb des GNU-Bildschirms. Ich finde es einfacher, nummerierte Bildschirmfenster im Auge zu behalten als a Schiffsladung Tabs in Konsole (oder einem anderen Terminalemulator, den ich ausprobiert habe). Wenn Sie screen noch nicht kennen, lernen Sie tmux, weil es neuer und weniger mürrisch ist.

So etwas wie die Funktionalität zum Öffnen einer neuen Shell mit Im selben cwd wie in einer anderen Shell verwende ich einen benutzerdefinierten Hook für cd / pushd / popd, mit dem ich cds 8 verwenden kann, um auf eine beliebige CD zu wechseln dir meine Shell in Bildschirmfenster 8 verwendet. Dies funktioniert auch für Shells außerhalb der Bildschirmsitzung, solange es nur eine Bildschirmsitzung gibt.

Kommentare

  • Meins ‚ scheint nicht “ richtig konfiguriert zu sein „. Viele der Verknüpfungen, die ich hier sehe, funktionieren nicht ‚. Ich verwende das Standardterminal von Ubuntu 14.04. Wie kann ich es konfigurieren?
  • @JorgeeFG: Ich denke, es hat bei mir mit gnome-terminal in Ubuntu 14.04 sofort funktioniert, bevor ich zu KDE gewechselt bin. Die entsprechende Option befindet sich in Ihren Terminaleinstellungen, esc-prefix vs hig h-bit und vielleicht einige andere einstellungen. Einige von ihnen ‚ funktionieren durch ssh nicht perfekt für mich. (zB Strg links / rechts munge den Escape-Code für die Pfeiltaste und ich erhalte 5D im wahrsten Sinne des Wortes)

Antwort

Fügen Sie die folgenden Zeilen zu Ihrer ~/.inputrc

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

Dies ähnelt der Antwort von egmont, verwendet jedoch anstelle von Bild auf und Bild ab die Escape-Sequenzen für Pfeil nach oben und Pfeil nach unten. Diese Methode ist auf einem Mac wesentlich bequemer.

Antwort

Ich neige immer dazu, meine Maschinen mit einer großen HISTSIZE Wert, so dass eine längere Verlaufsliste sowie HISTTIMEFORMAT mit dem Zeitstempelwert so geführt werden Ich kann sehen, wann der Befehl ausgeführt wurde.

export HISTSIZE=10000 export HISTTIMEFORMAT="%m/%d/%Y %T " 

Antwort

Normalerweise verwende ich das history Befehl mit grep

IE:

history | grep <command im looking for> 

Daraufhin wird ein nummerierter Verlauf der von Ihnen eingegebenen Befehle angezeigt, die diesen Befehl enthalten. Anschließend können Sie Folgendes verwenden:

!<number listed in history command> 

, um diesen Befehl zu wiederholen.

IE:

history | grep history

142 history 143 history | grep lvresize 568 history | grep echo 570 history | grep echo 571 history | grep history 

gefolgt von: !571

wiederholt history | grep history

Kommentare

  • CR = viel besser + viel sicherer
  • Vielleicht persönlich finde ich einen Verlauf, der an grep weitergeleitet wird, ein schnelleres Mittel, um die meisten Befehle zu finden. Was Safer betrifft, bin ich ‚ nicht sicher, was Sie meinen. Welche Risiken birgt die Verwendung des Verlaufs bei der Suche mit cR?
  • @ Soße Ich vermute, PSkocik bedeutet, dass die Ersetzung der ! -Historie weniger sicher ist.
  • @Gravy Die inhärenten Risiken würden versehentlich die falsche Zeile erhalten. Keine Ahnung, warum Ihr Terminal eingefroren ist, es sei denn, Sie haben Control-S verwendet und die xon / xoff-Flusssteuerung aktiviert (häufig die Standardeinstellung). Wenn ja, wird Control-Q es zurückbringen.
  • Ich stimme @PSkocik zu, cr ist viel besser, weil es ‚ s ist Es ist einfacher, die Verlaufszeile zu bearbeiten, als sie auf die gleiche Weise erneut auszuführen. Das erneute Ausführen des exakt gleichen Befehls ist ein trivialer Fall, wie Sie Zeit sparen können, indem Sie Variationen komplexer Einzeiler erneut eingeben oder eine andere Datei auf einem langen Pfad durch Tabulatoren vervollständigen. Siehe meine Antwort.

Antwort

Ich habe täglich 4 Tipps verwendet (und einige andere) in meinem Bash-Terminal:

  • Führen Sie den letzten Befehl aus: !!

  • Führen Sie den Befehl aus N aus der Geschichte: !N

  • Druckt den letzten Befehl beginnend mit Präfix aus der Geschichte: !prefix:p

  • Führen Sie den letzten Befehl aus, beginnend mit Präfix aus der Geschichte: !prefix

Kommentare

  • Ich denke, dass die Verwendung des Befehls N aus dem Verlauf einer von ist Die besten Wege, um sich für die meisten Menschen in den Fuß zu schießen 🙂 Nur sagen

Antwort

If Es ist in Ordnung, wenn Sie zsh anstelle von bash verwenden. Sie können oh-mi-zsh verwenden dafür.

Mit den Aufwärts- und Abwärtspfeilen können Sie in Ihrem Befehlsverlauf navigieren. Es ermöglicht auch die gleiche Navigation, wenn Sie den Text bereits eingegeben haben (wie in Mathlab).

edit: Oh-my-zsh ist ein großes, entwicklerorientiertes Softwarepaket, das viele andere Funktionen enthält, z Aliase, Themen, Plugins. Diese Extras machen die Verwendung der Distribution komplexer als eine Tastenkombination.

https://github.com/robbyrussell/oh-my-zsh

Kommentare

  • oh-my-zsh enthält Tonnen von Dingen. Sie können genauso gut sagen: Diese genaue Funktion ist in dieser Distribution enthalten, wenn Sie lediglich eine bestimmte Einstellung oder App benötigen.
  • Ich habe den Beitrag bearbeitet: Ich habe gewarnt, dass er größer als eine einfache App ist.

Antwort

Fügen Sie den folgenden Alias zu ~ / .bashrc

Verwendung: h fire bringt mir eine Liste von Befehlen, die fire enthalten. oder h ^fire zeigt mir eine Liste von Befehlen an, die mit fire beginnen.

Dies ist nützlich, wenn ich eine Reihe von Befehlen anzeigen möchte zur gleichen Zeit.

Übrigens ist """"" hässlich, aber ich konnte keine anderen Möglichkeiten finden, um einfache Anführungszeichen in einfachen Anführungszeichen zu vermeiden.

Kommentare

  • fyi – h="history | awk '{\$1=\"\"; print}' sollte funktionieren. Alternativ können Sie eine Funktion erstellen und diese aufrufen.
  • Danke DarkHeart, aber ich habe Ihren Code ausprobiert und festgestellt, dass er in meiner Umgebung nicht funktioniert. Vielleicht gibt es etwas anderes in meiner

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.