In Bash gibt es einige praktische Operatoren, mit denen Sie Teile des letzten Befehls wiederholen können:
!^
erweitert sich auf das erste Argument des vorherigen Befehls, z.$ echo one "two three" one two three $ echo !^ echo one one
!$
erweitert sich zum letzten Argument des vorherigen Befehls, z.$ echo one "two three" one two three $ echo !$ echo "two three" two three
!*
Erweitert sich auf alle Argumente des vorherigen Befehls, z.$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(Soweit ich verstehe, sind diese syntaktischer Zucker für !!:^
, !!:$
und !!:*
sind, wobei !!
ein Ereignis Bezeichner , dass sich ausdehnt , um zum vorherigen Befehl, und ^
, $
und *
Wortbezeich sind, finden Sie in der Bash - Referenzhandbuch oder man bash
.)
Diese sind oft sehr praktisch. Mit Tastaturkürzeln wird es aber noch cooler:
Wenn Sie Alt+ .oder Alt+ drücken _, wird das letzte Argument des vorherigen Befehls in den aktuellen Befehl eingefügt, ähnlich als hätten Sie
!$
zu diesem Zeitpunkt geschrieben.Sie können auch Alt+ Ctrl+ ydrücken, um das erste Argument des vorherigen Befehls einzufügen, als hätten Sie
!^
zu diesem Zeitpunkt geschrieben.
(Siehe die GNU Readline Library oder info readline
.)
Ich bevorzuge die Tastaturkürzel gegenüber den Verlaufsoperatoren von Bash, da ich sehen kann, was ich einfüge, bevor ich den Befehl tatsächlich ausführe. Es scheint jedoch keine Verknüpfung zu geben, mit der ich alle Wörter des vorherigen Befehls einfügen kann, dh eines, das !*
die Aufgabe erfüllt . Zumindest konnte ich es nicht finden.
Gibt es so eine Abkürzung? Wenn nicht, ist es möglich, die Readline-Bibliothek so zu konfigurieren, dass eine hinzugefügt wird, und wie?
quelle
zsh
wenn Sie gebenecho !*
und drücken Sie dann TAB, haben Sie den gewünschten Effekt. Im Allgemeinen erweitert TAB in der Readline alle erweiterbaren Elemente. Sehr praktisch; wahrscheinlich wird bash eine Konfiguration mit dem gleichen Effekt haben? @ Seth, ich denke, dies ist die Readline in Bash, nicht der Terminal-Emulator - aber nicht sicher.man bash
(irgendwo in der Zeile 3030)\e.
und\e_
sind der Readline-Funktion zugeordnetyank-last-arg
und\e\C-y
sind zugeordnetyank-nth-arg
. Leider scheint es keinen (einzelnen) Befehl zu geben, der mehrere vorherige Argumente gleichzeitig hinzufügt.Antworten:
Wenn Sie sich die Ausgabe des folgenden Befehls ansehen:
oder besser:
Sie können sehen, dass für alle Argumente keine Readline-Funktion vorhanden ist, z. B.
yank-last-arg
für das letzte Argument, mit dem das letzte Argument in den vorherigen Befehl (das letzte Wort des vorherigen Verlaufseintrags) eingefügt werden kann. Wenn eine solche Funktion nicht vorhanden ist, gibt es höchstwahrscheinlich keine Verknüpfung, um das zu erreichen, was Sie wünschen.Lassen Sie uns versuchen, eine Kiste zu erstellen, die Ihrer Anfrage entspricht ...
Schauen Sie sich zunächst beispielsweise die Ausgabe des folgenden Befehls an:
Die Ausgabe ist:
und kann wie folgt übersetzt werden:
yank-nth-arg
(die das erste Argument in den vorherigen Befehl einfügen - mit einem Argument n das n-te Argument aus dem vorherigen Befehl einfügen) ist an Alt+ Ctrl+ gebunden y.Auf die gleiche Weise kann jede Zeile aus der
bind -p
Befehlsausgabe interpretiert werden .Achten Sie nun auf die folgenden Szenarien:
Wenn Sie die folgende Bindung festlegen:
Alt+ Awird Alt+ 2Alt+ zugeordnet, .das zugeordnet wird, um das zweite Argument des vorherigen Befehls einzufügen. Wenn Sie also Alt+ drücken A, wird das zweite Argument des vorherigen Befehls in den aktuellen Befehl eingefügt.
Wenn Sie einstellen:
Nach dem Drücken von Alt+ Awerden die ersten beiden Argumente des vorherigen Befehls in den aktuellen Befehl eingefügt. Wenn die Anzahl der Argumente aus dem vorherigen Befehl maximal 2 beträgt, wird natürlich der gesamte vorherige Befehl in den aktuellen Befehl eingefügt.
Wenn Sie einstellen:
Nach dem Drücken von Alt+ Awerden die ersten drei Argumente des vorherigen Befehls in den aktuellen Befehl eingefügt. Wenn die Anzahl der Argumente aus dem vorherigen Befehl maximal 3 beträgt (wie in Ihrem Fall), wird natürlich der gesamte vorherige Befehl in den aktuellen Befehl eingefügt.
Und so weiter.
Für die ersten 10 Argumente können Sie Folgendes verwenden:
Und ich denke, dass dies lang genug ist, da ich nicht zu oft Befehle mit so vielen Argumenten verwende.
Fügen Sie Ihrer
~/.inputrc
Datei die folgende Zeilenzeile hinzu, um sie dauerhaft zu machen :In diesem Beispiel habe ich Alt+ gewählt A, um alle Argumente (wenn die Anzahl der Argumente nicht größer als 10 ist) des vorherigen Befehls einzufügen. Sie können jedoch eine beliebige andere Kombination auswählen, indem Sie die
\ea
Zeichenfolge im vorherigen Befehl ersetzen .Ressourcen:
help -m bind
quelle
funmap.c
die Funktion in der Dateiyank-nth-arg
der C-Funktion zugeordnet istrl_yank_nth_arg
, die wiederum in definiert istkill.c
. Analog füryank-last-arg
. Natürlich wäre es möglich, readline mit einer solchen Funktionalität zu erweitern, aber das möchte ich nicht. Ich bevorzuge, dass meine Readline von verwaltet wirdapt
, und diese Funktion ist nicht so wichtig;)