Wie wiederhole ich den aktuell eingegebenen Parameter auf der Bash-Konsole?

23

Ich habe nur etwas getippt nach:

mv foo/bar/poit/zoid/narf.txt

und plötzlich wurde mir klar, verdammt, dass ich wieder große Teile dieses Parameters eingeben muss

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt

Auch bei tabcompletion ein ziemlicher Schmerz. Ich weiß, dass ich den Parameter kopieren und einfügen kann, indem ich den Text mit der Maus auswähle und mit der mittleren Maustaste klicke, aber das ist nicht gut genug. Ich möchte auf der Tastatur bleiben.

Gibt es eine Möglichkeit, den aktuellen Parameter der Zeile mithilfe der Tastatur einzufügen?

k0pernikus
quelle
3
Mein Rat beantwortet Ihre Frage nicht, ist aber ein kleiner Tipp. Wie in Ihrem Beispiel können Sie die nächste Konstruktion verwenden: mv foo/bar/poit/zoid/{narf.txt,troz.txt}Stattdessen müssen Sie lange Adressen zweimal eingeben / kopieren.
Ansturm
2
Etwas kürzer als @ Rush Lösung: mv foo/bar/poit/zoid/{narf,troz}.txt. Dies funktioniert besonders gut, wenn wir so etwas haben.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ansgar Esztermann
@ Ansturm Macht es Ihnen etwas aus, darauf als Antwort hinzuweisen? Es ist vielleicht nicht direkt das, wonach ich gefragt habe, aber andererseits ist Ihre Lösung viel mehr als das, was ich will. Es verdient ein Zeichen der Akzeptanz.
k0pernikus

Antworten:

15

Wenn ich im Voraus geplant habe, verwende ich die Klammererweiterung . In diesem Fall:

mv foo/bar/poit/zoid/{narf,troz}.txt

Hier ist ein anderer Ansatz unter Verwendung der Standardtastenkürzel readline:

  • mv foo/bar/poit/soid/narf.txt: Start
  • Ctrl- w: unix-word-ruboutzu löschenfoo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yank, Raum, yankwieder gesund zu werdenmv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace: backward-kill-wordzweimal, um den letzten zu löschennarf.txt
  • troz.txt: Geben Sie den Schwanzteil ein, der anders ist

Wenn Sie nicht ganz so viel Zeit mit der bashShell verbringen , empfehle ich, in regelmäßigen Abständen eine Liste der Standardverknüpfungen zu lesen und einige auszuwählen, die nützlich erscheinen, um sie zu erlernen und in Ihre Routine zu integrieren. Kapitel 8 des bashHandbuchs ist ein guter Anfang. Wenn Sie die Verknüpfungen kennen, können Sie Ihre Effizienz steigern.

jw013
quelle
Ordentlich! In meinem Fall musste ich Alt + Backspace anstelle von Meta + Backspace drücken.
k0pernikus
3
@ k0pernikus Ja, bei den meisten Tastaturen ist die Alt-Taste die Meta-Taste.
JW013
1
Um das erneute Eingeben zu speichern .txt, können Sie Strg + Links (oder eine andere Verknüpfung, die aufgerufen wird) drücken backward-word, ein Zeichen nach links und dann Alt + Rücktaste drücken und eingeben troz.
wjandrea
24

Die Verlaufserweiterung funktioniert auch für den aktuellen Befehl mithilfe der Ereignisbezeichnung !#. Kombinieren Sie dies mit dem Wortbezeichner für das letzte Argument - $-, um den Parameter zu erhalten, den Sie gerade eingegeben haben. Und Sie können alle regulären Modifikatoren darüber verwenden. Wenn Sie z. B. eine Datei in einem weit entfernten Verzeichnis umbenennen, können Sie einfach Folgendes eingeben:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
qwertyboy
quelle
Sehr hilfreich! Dies funktioniert besonders gut mit der bash- magic-spaceOption in inputrc zum automatischen Erweitern von Verlaufserweiterungen. (Ich konnte die Antwort mit den meisten Stimmen nicht verwenden, da ich festgelegt habe, dass ^ W bei Schrägstrichen unterbrochen wird, da dies normalerweise sinnvoller ist.)
Soren Bjornstad
@SorenBjornstad alt+backspacestoppt normalerweise bereits bei Worttrennzeichen wie Schrägstrichen, sodass Sie nicht ändern müssen, wie ^WSie diese Funktionalität erhalten. Sie können sowohl durch Nicht-Wortzeichen als auch durch Leerzeichen getrennte Wörter löschen lassen
Eric Renouf
14

Wie in Ihrem Beispiel können Sie folgende Konstruktion verwenden:

mv foo/bar/poit/zoid/{narf.txt,troz.txt}

oder sogar (wie vorgeschlagen Ansgar Esztermann ):

mv foo/bar/poit/zoid/{narf,troz}.txt

Stattdessen muss keine lange Adresse zweimal eingegeben / kopiert werden.

eilen
quelle
2
Dies wird als Klammererweiterung bezeichnet .
CodeGnome
6

Herumspielen brachte ich das zum Laufen:

mv foo/bar/poit/zoid/narf.txt

Schlagen Enter
, um den letzten Parameter zu speichern.

Jetzt benutzen , um zum letzten Mal in die Zeile zurückzugelangen. Geben Sie ein Leerzeichen ein und verwenden Sie zum Abrufen des zuletzt verwendeten Parameters Folgendes:

Alt + .

Ich hasse es, einen Fehler zu provozieren, aber in diesem Anwendungsfall wird der Job erledigt.

k0pernikus
quelle
Cool, noch ein toller Tipp gelernt!
Bram
<kbd> Esc </ kbd> + <kbd>. </ kbd> ist (es?) dasselbe wie <kbd> Alt </ kbd> + <kbd>. </ kbd>.
Nikos Alexandris
2

Sie können einfach Variablen verwenden:

a=test.csv ; cp $a $a.bak

Oder in Ihrem Fall (Note Tab-Wettbewerb funktioniert für den einen Teil):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt
ppp
quelle
2

Ich habe das in meinem ~/.inputrc:

"\ej":"!#:$\e^"

!#ist die aktuelle Zeile, :$ist das letzte Wort und \e^ist history-expand-line.

Nisetama
quelle
Dies sollte als Antwort markiert werden. Durch Drücken von 'Alt / Option + J' wird nun das letzte Wort kopiert.
mpprdev
2

Für zshmich sind die folgenden Tastenkombinationen hilfreich.

# Bind alt-m to insert previous word from the current line
bindkey '^[m' copy-prev-shell-word

# Bind alt-k to kill word before cursor in vi-style
bindkey '^[k' vi-backward-kill-word

Also drücke ich Alt- Mum das letzte Argument zu wiederholen Alt-K wenn ich Teile vom Ende eines Pfades löschen möchte.

Hier finden Sie einen nützlichen Verweis auf einige der Verhaltensweisen, die Sie zuordnen können.

bdellaterra
quelle
2

Eine kurze interaktive zweistufige Lösung

  1. Art: echo foo/bar/poit/zoid/narf.txt

    Dies stellt foo/bar/poit/zoid/narf.txtdie Alt- .Verknüpfung in der Bash zur Verfügung.

  2. Typ: mvund Hit Alt- ., Space, Alt-.

    Du wirst bekommen mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txt. Jetzt können Sie das letzte Wort einfach ändern.

Mitternachtskommandant

Dieses (sehr) nützliche Tool ist ein Dateimanager, der in der Konsole ausgeführt wird. Sie haben die Möglichkeit, Dateinamen und Verzeichnispfade interaktiv in die Befehlszeile zu kopieren. Midnight Commander zeigt Ihnen daher 2 Panels (links und rechts), die den Inhalt verschiedener Verzeichnisse auflisten.

Ein kurzer Leitfaden:

  • UpMit den DownPfeiltasten / können Sie Dateien im aktuellen Bedienfeld auswählen.
  • Tab schaltet zwischen linkem und rechtem Bedienfeld um.
  • Ctrl- Shift- Enterkopiert die aktuell ausgewählte Datei in die Befehlszeile (einschließlich des vollständigen Pfads)
  • Alt- oöffnet das aktuell ausgewählte Verzeichnis im anderen Bereich
  • Ctrl- oZeigt die Konsole im Vollbildmodus an
  • Ctrl- x, pkopiert den Pfad des aktiven Panels in die Konsole
  • Ctrl- x, Ctrl-p kopiert den Pfad des inaktiven Fensters in die Konsole
  • Esc- Tabist die automatische Vervollständigung

Dies ist bei weitem der schnellste Weg, den ich bisher gefunden habe - nachdem ich mich an die Abkürzungen gewöhnt hatte.

Markus Dutschke
quelle
0

Verwenden Sie dasselbe im {,} "Duplikator". Dh:

git tag -m {v,v}1.0.1

# same as 

git tag -m v1.0.1 v1.0.1
Pylinux
quelle