Ich möchte meinen Workflow mit Bash ein wenig verbessern und stelle fest, dass ich häufig den gleichen Befehl für eine andere ausführbare Datei ausführen möchte.
Einige Beispiele:
Git (wo ich das zweite Wort schnell ändern möchte):
git diff foo/bar.c
git checkout foo/bar.c
Cat / rm (wobei nur das erste Wort geändert werden muss):
cat foo/is/a/very/long/path/to/bar.c
rm foo/is/a/very/long/path/to/bar.c
Ich weiß, dass ich Ctrl+ adann Deldrücken kann , um das erste Wort zu entfernen, aber ich frage mich, ob es einen schnelleren Weg gibt, dies zu tun.
Antworten:
!$
wird bis zum letzten Wort Ihres vorherigen Befehls erweitert.Sie könnten also Folgendes tun:
oder:
Ihre Beispiele haben zufällig nur das letzte Wort wiederholt, also hat es gut
!$
funktioniert. Wenn Sie tatsächlich viele Argumente hatten, die Sie wiederholen wollten, und Sie nur das erste Wort ändern wollten, könnten Sie verwenden!*
, das auf alle Wörter des vorherigen Befehls mit Ausnahme der Null erweitert wird.Siehe den Abschnitt "HISTORY EXPANSION" auf der
bash
Manpage. Da gibt es viel Flexibilität.quelle
!$
Ihnen haben Sie keine volle visuelle Kontrolle über die Linie, die Sie gerade laufen . Dies kann manchmal schädlich sein. Insbesondere, wenn Sie einen Druckfehler haben. Es gehthistory
darum, was zu erweitern. Wenn Sie also den letzten Befehl mit einem Leerzeichen am Anfang schreiben, wird dieser Befehl wahrscheinlich nicht im Verlauf enden. Wenn Sie Ihren neuen Befehl mit!$
der Shell ausführen , werden die Parameter nicht von der zuletzt eingegebenen Befehlszeile übernommen, sondern nur vom letzten des Verlaufs. Hier gleich mehr Worte.#
oder ein hinzu,echo
damit ich kann Sieh es dir an und es geht in die Geschichte ein, damit ich es sofort wieder verwenden und erneut ausführen kann, ohne das Präfix zu deaktivieren.Ctrl+ aum an den Zeilenanfang zu springen , Alt+ dum das erste Wort zu löschen.
quelle
Meta+D
ist nur gültig, wennemacs
aktiviert ist (überset -o emacs
oder einfach standardmäßig). Es funktioniert nicht im minderwertigen Editor- Modus oder wennemacs
deaktiviert.C-a
undM-d
sind viel schneller zu tippen, wenn sich Ihre Hände bereits in Schreibposition befinden.cat
und vergleichen Sie, was Sie erhalten, wenn Sie Home (^[[H
hier) und Strg + a (^A
) drücken .Ich bin nicht sicher, ob es tatsächlich schneller wäre oder nicht, aber siehe diesen Artikel, insbesondere Punkt # .3:
quelle
Alt+.
Wenn Sie nur den letzten Teil eines der vorherigen Befehle wiederholen müssen, können Sie Alt+ verwenden ., um das letzte Argument aus der letzten Zeile des Verlaufs einzufügen.
Wenn mehr als einmal gedrückt wird, wird das, was gerade eingefügt wurde, durch das letzte Argument der Zeile vor ... ersetzt.
ZB wenn die letzten 2 Befehle wären:
In der Shell ich schreibe
rm
und ich drücken Alt+ .es erscheint:Wenn ich erneut drücke , wird stattdessen Alt+ .angezeigt
und so weiter...
quelle
bash
. BTW Sind Sie sicher, dass Sie Bash als Shell verwenden ?≥
Zusätzlich zur Antwort von @jjlin könnten Sie die folgenden Tipps interessieren:
$_
Enthält das letzte Argument der vorherigen BefehlszeileWeitere Informationen hierzu finden Sie im Abschnitt "Readline Command Names" der
bash
Manpage.z.B:
quelle
n
Wörter im Befehl entfernen (austauschen) ,n = 1
im ersten Beispiel undn = 2
im zweiten. Die Antwort von jjlin zeigt, wie Sie das erste Wort löschen (und durch erneutes Anwenden der Verknüpfung bis zun
Wörter löschen ). In Ihrer Antwort sind einige Bash-Verknüpfungen aufgeführt (die in der Tat nützlich sind), aber keine davon ist eine effiziente Methode zum Löschen der erstenn
Wörter.$_
Parameter würde wahrscheinlich funktionieren, wenn es nur ein Argument gibt (dh wennn = m - 1
wom
die Gesamtzahl der Argumente ist). Der Rest der Verknüpfungen ist jedoch für die Frage irrelevant.Wenn Sie sich mit vi auskennen, können Sie vi-Bindungen in bash (die meisten Shells?) Mit dem Befehl aktivieren
set -o vi
. Anschließend können Sie Ihren Befehl mit den normalen vi-Tasten bearbeiten. In Ihrem ersten Beispiel können Sie ^wcw"diff" löschen und dann in "checkout" ändern.Es lohnt sich vielleicht nicht, die vi-Tastenkombinationen nur zum Bearbeiten der Befehlszeile zu erlernen, aber wenn Sie sie bereits kennen, ist sie eine ordentliche Produktivitätssteigerung.
quelle
set -o vi
ich gelebt! Ich mache das sogar in meinen Bash-Anweisungen.bindkey -v
für zsh.Esc
0
c
w
Es gibt viele Möglichkeiten, diese Katze zu häuten!
Um eine bestimmte Zeichenfolge zu ersetzen,
^old^new^extra
übernehmen Sie Ihren vorherigen Befehl, ersetzen Sieold
mitnew
und hängen Sie ihn anextra
. Sie können so früh aufhören, wie Sie möchten; zB^old
wird durchold
die leere Zeichenkette ersetzt und die leere Zeichenkette angehängt (im Wesentlichen löschenold
und nichts mehr tun).Besonders nützliche Variante davon:
Um ein bestimmtes Wort zu ersetzen, können Sie
!m:n-p
auf Wörtern
durchp
den Befehl verweisenm
(verwenden Sie negative Zahlen, um vom aktuellen Befehl zurück zu zählen). Sie können den-p
Teil weglassen , um auf ein einzelnes Wort zu verweisen, und den:m-p
Teil weglassen , um auf einen gesamten Befehl zu verweisen. Sonderformen!!
für!-1
,!$
für das letzte Wort des vorherigen Befehls und!*
für die Argumente (außer Wort0
) des vorherigen Befehls sind sehr praktisch.Ich benutze oft beide; zsh ist hier besonders schön, da das Drücken der Tabulatortaste das kryptische Material erweitert, um sicherzustellen, dass Sie es richtig verstanden haben.
Es gibt auch so viele Möglichkeiten, dies mit der Zeilenbearbeitung zu tun. Lesen Sie die Tastenkombinationen Ihrer Shell.
quelle
Die meisten Terminalprogramme unterstützen ...
<Up-Arrow>
nach Bedarf, um eine der vorherigen Befehlszeilen aus dem Verlauf erneut anzuzeigen.<Down-Arrow>
nach Bedarf, um die Verlaufsliste vorwärts zu durchlaufen.<Left-Arrow>
Bedarf drücken, um den Cursor an das Ende des zweiten Wortes zu bewegen.<Backspace>
nach Bedarf, um das zweite Wort zu löschen.<Right-Arrow>
/<Left-Arrow>
, um die Position zu ändern.<RETURN>
, um den Befehl auszuführenWenn die gewünschte Befehlszeile nicht aktuell war, führen Sie eine Reverse-i-Suche
<Ctrl-r>
wie in Frage beschrieben durch.Gibt es eine Möglichkeit, Strg-R zu verwenden, nachdem Sie einen Teil des Befehls in Bash eingegeben haben?
Dann über die Pfeiltasten nach Bedarf bearbeiten.
quelle
Was ich mache (Ubuntu / bash):
1)
Arrow up
Hey, um zum vorherigen Befehl zurückzukehren.2)
Home
Taste, um zum Anfang zurückzukehren.3) Ändern Sie den Befehl nach Bedarf.
Idiotensicher und besonders nützlich für mehrzeilige Befehle.
quelle