it-swarm.com.de

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.

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

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

74
Lee

Was Sie suchen, ist CtrlR.

Art CtrlR Geben Sie dann einen Teil des gewünschten Befehls ein. Bash zeigt den ersten übereinstimmenden Befehl an. Tippe weiter CtrlR und bash durchlaufen frühere Übereinstimmungsbefehle.

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

Dies ist unter "Suchen" in man bash.

109
John1024

Legen Sie diese in Ihre ~/.inputrc:

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

Diese machen Page Up und Page Down benimm dich wie du willst. (Einige Distributionen haben es bereits für Sie konfiguriert.) Ich persönlich finde diesen Weg bequemer als Ctrl+R oder history.

33
egmont

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 abzurufen. (Beachten Sie jedoch, dass ein abschließendes & Als letztes Wort für Hintergrundbefehle gilt.).

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

Um das vorletzte Wort zu erhalten, verwenden Sie esc-2alt+. (Verwenden Sie also ein numerisches Argument im Emacs-Stil für alt+.. Negative zählt vom Ende an, positive zählen von Anfang an vorwärts.) Aber das ist normalerweise mehr Ärger als es wert ist; Irgendwann ist es schneller, nach der Maus zu greifen und sie zu kopieren/einzufügen oder nach oben und ^ w/^ y Teil davon (siehe unten).


Wenn Ihr Terminal gut/richtig eingerichtet ist, werden Strg-Links und Strg-Rechts durch Wörter vorwärts/rückwärts bewegt. Wenn nicht, werden hoffentlich mindestens alt-b und alt-f dasselbe tun.


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 ergibt sich aus der Verwendung des Kill-Rings, der genau wie in Emacs funktioniert. 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 machen beim Kill-Ring-Eintrag. Verwenden Sie den Pfeil nach links und rechts oder etwas anderes, um den Eintrag aufzubrechen, wenn Sie zwei Dinge entfernen und später nur eines einfügen möchten.

Kombinieren Sie all dies zusammen

  • starten Sie die Eingabe eines Befehls
  • strg-R, 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 (d. h. den ganzen 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 aktuellen Verzeichnisses). Manchmal praktisch für den interaktiven Gebrauch, aber normalerweise ist find -name '*.c' -exec foo {} + Besser.

Wenn Sie Bash-Skripte schreiben, ist es praktisch, shopt -s extglob Auch in Ihren interaktiven Shells zu aktivieren. Sie werden manchmal eine Verwendung für Dinge wie *.!(c|h) finden, um Dateien abzugleichen, die nicht mit .c oder .h enden.

Finden Sie Aliase, die Sie für ls -l, less und alles andere mögen, was Sie häufig tun. (cp -i, mv -i Und rm -I Sind nett. Gewöhnen Sie sich nicht an abhängig von auf sie, um eine selektive rm zu tun. GNU rm -Ich frage einmal nach allen Argumenten.)

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


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

Um so etwas wie die Funktionalität zum Öffnen einer neuen Shell mit demselben cwd wie eine andere Shell zu erhalten, verwende ich einen benutzerdefinierten Hook für cd/pushd/popd, mit dem ich cds 8 Für CDs in ein beliebiges Verzeichnis ausführen kann Shell in Bildschirmfenster 8 wird verwendet. Dies funktioniert auch für Shells außerhalb der Bildschirmsitzung, solange nur eine Bildschirmsitzung vorhanden ist.

10
Peter Cordes

Fügen Sie die folgenden Zeilen zu Ihrem ~/.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 viel bequemer.

7
John Slavick

Ich neige immer dazu, meine Maschinen mit einem großen HISTSIZE Wert zu konfigurieren, damit eine längere Verlaufsliste sowie HISTTIMEFORMAT) GEFÜHRT WERDEN mit dem Zeitstempelwert, damit ich sehen kann, wann der Befehl ausgeführt wurde.

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

Das Mittel, das ich normalerweise benutze, besteht darin, den Befehl history mit grep zu kombinieren

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

wird history | grep history wiederholen

3
Gravy

Wenn es für Sie in Ordnung ist, zsh anstelle von bash zu verwenden, können Sie dafür oh-mi-zsh verwenden.

Sie können in Ihrem Befehlsverlauf mit den Aufwärts- und Abwärtspfeilen 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

2
user9869932

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

  • Letzten Befehl ausführen :!!

  • Befehl ausführen [~ # ~] n [~ # ~] aus der Geschichte :!N

  • Drucken Sie den letzten Befehl beginnend mit Präfix aus dem Verlauf :!prefix:p

  • Führen Sie den letzten Befehl beginnend mit aus Präfix aus dem Verlauf :!prefix

2
Nolwennig

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

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

Verwendungszweck: h fire wird mir eine Liste von Befehlen geben, die fire enthalten. oder h ^fire wird mir eine Liste von Befehlen geben, die mit fire beginnen.

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

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

1
Hosi Golden