Wie greife ich vom letzten Befehl im Verlauf auf das zweite Argument zu?

11

Ich fange an, Regex zu lernen, daher benutze ich diesen Befehl wiederholt:

grep pattern /usr/share/dict/american-english 

Nur der Teil mit Muster ändert sich, daher muss ich immer wieder den langen Ausdruck " / usr / share / dict / american-english " schreiben .

Jemand machte die Bemerkung, dass es möglich ist, ein Argument eines Befehls aus dem Befehlsverlauf zu erweitern, indem anstelle des vollständigen Ausdrucks kryptische Zeichenkombinationen eingegeben werden. Können Sie mir diese kryptischen Zeichenkombinationen sagen?

Abdul Al Hazred
quelle
Geht es um das zweite oder das letzte Argument?
Mikesserv
In diesem Fall ist das letzte Argument das zweite. Ich habe diese Unterscheidung nicht klargestellt.
Abdul Al Hazred
In diesem Fall werden die bash, dash, zsh, mksh, und kshSchalen (zumindest, dass ich weiß , über) werden alle erkennen , $_zuletzt arg spezielle Parameter (einige tun dies nur im interaktiven Modus, obwohl) . Es erweitert sich einfach wie eine Variable : grep somepattern filename; grep otherpattern "$_". Sie können seinen Inhalt normalerweise in der Ausgabe von sehen set.
Mikeserv

Antworten:

23

Sie können <M-.>(oder <Esc>.wenn Ihr Meta-Schlüssel für etwas anderes verwendet wird), dh Meta-Punkt (oder <esc> Punkt), wobei Meta normalerweise die Alt-Taste ist, verwenden, um das letzte Argument des vorherigen Befehls abzurufen. Also würden Sie zuerst tippen

$ grep foo /usr/share/dict/american-english

Und wenn Sie dann nach etwas anderem suchen wollten, würden Sie tippen

$ grep bar

Nach dem Eingeben eines Leerzeichens und dann Esc.(dh zuerst Drücken der Escape-Taste und dann der Punkt-Taste):

$ grep bar /usr/share/dict/american-english

Sie können auch eine der folgenden Optionen verwenden:

$ grep bar !:2
$ grep bar !$

Wo !:2und !$bedeuten "zweites Argument" bzw. "letztes Argument".

Türknauf
quelle
Dies ist für Bash und Shells, die Readline mit Emacs (Standard) -Bindungen verwenden: Mit editing-mode viSet müssen Sie eine Bindung ~/.inputrcfür yank-last-argfor hinzufügen und für Zsh müssen Sie binden insert-last-word...
Jasonwryan
@jasonwryan, wenn es das letzte ist arg Sie wollen, dann in einem (interaktiv) zsh , bash, ksh, mksh, oder dashMuscheln können Sie einfach verwenden $_. POSIXLY diese Bindung ist jedoch bereits auf ESC _wann gesetzt set -o viist wirksam.
Mikesserv
@mikeserv Danke Mike, ich muss es aus Kompatibilitätsgründen zurückgebunden haben ...
Jasonwryan
@jasonwryan - kein Problem - dies ist einfach der einzige Shell-Tastaturtrick, den ich kenne - ich kann mich nicht an all diese Schnellverknüpfungen erinnern / konfigurieren. Wenn Sie nichts dagegen haben, Kompatibilität w / was? Gibt es ein Programm, das Sie verwenden und das es anders macht? Oh, ich kann mich auch an ESC @letter für die _letterAlias-Bindung erinnern - aber nur, weil ich immer noch nicht herausfinden kann, wie es mit bsd funktioniert editline.
Mikesserv
@mikeserv Ich binde es so, dass es das gleiche ist, egal ob ich Bash oder Zsh (beide im vi-Modus) oder auf einer Maschine mit Bash im Emacs-Modus verwende (es ist eine der Bindungen, die ich wirklich hämmere).
Jasonwryan
2

Im Allgemeinen (mit Bash) <Esc> N <Esc> .wird das N-te Argument aus dem vorherigen Befehl in die aktuelle Befehlszeile zurückgerufen (wobei N auf 0 basiert).

Für das zweite Argument aus dem letzten Befehl wäre das:

<Esc> 1 <Esc> .

Wenn Sie das dritte Argument wollten, dann

<Esc> 2 <Esc> .

... und so weiter.

Wie andere bereits erwähnt haben , gibt es eine spezielle Verknüpfung dafür , wenn Sie das letzte Argument aus dem vorherigen Befehl möchten :

<Esc> .

abonet
quelle