So wiederholen Sie einen Befehl mit einem hinzugefügten Parameter

7

Ich weiß , wie ein Befehl wiederholen und mehr Text , nachdem er hinzu mit !!etwa so:

ls -l
!! tmp

Die zweite Zeile wird erweitert zu ls -l tmp.

Aber was ist, wenn ich dem Befehl zwischen den Wörtern Parameter hinzufügen möchte? Zum Beispiel, wenn ich Folgendes getan habe:

ls tmp

... dann möchte ich oft den -lParameter zum Befehl hinzufügen , aber nicht das Ganze erneut eingeben oder nach oben drücken und die Pfeiltasten verwenden, um den Cursor auf die richtige Stelle zu setzen. !! -lfunktioniert nicht, weil es wird, ls tmp -lwas nicht gültig ist. (In der Praxis ist der Befehl viel länger als das einfache Beispiel, das ich hier verwendet habe.)

Mit anderen Worten, ich suche nach etwas wie ?? -lwo ??ist etwas, das den vorherigen Befehl wiederholt, aber -lzwischen dem ersten und dem zweiten Wort hinzufügt .


Nur um es klar zu machen, ls -l tmpist nur ein vereinfachtes Beispiel. Der reale Anwendungsfall ist näher an so etwas wie /very/long/path/to/very-long-command --with=a --very=long --parameter=list.

Moyli
quelle
2
Zum Beispiel kann es sein, ^ ^ -l ^welcher Austausch spacefür space -l spaceoder ^s^s -l^(ist aber auch ls tmp -lpraktikabel)
Costas
2
Versuchen Sie es !!:0 -l /tmp. Hier 0bedeutet erstes Wort, dh. der Befehl selbst. Natürlich können Sie dies auch tun, !!:0 -l !!:1wenn Sie nicht wiederholen möchten /tmp.
Jimmyij
Beide scheinen zu funktionieren. Sie sollten sie als Antworten hinzufügen ...
Moyli

Antworten:

3

!!:0ist das 0-te Wort des vorherigen Befehls und enthält !!:*alle Wörter außer dem 0-ten.

!!:0 -l !!:*

ist der Befehl, den Sie suchen.

Quelle https://www.gnu.org/software/bash/manual/bash.html#Word-Designators

sverre
quelle
Das war sehr hilfreich für mich. Ich werde oft versuchen, einen neuen Git-Zweig auszuchecken, aber das -bFlag vergessen , das einen neuen Zweig öffnet. Also könnte ich tippen git checkout whatever, um das hinzuzufügen -b, was ich brauche, ich kann dies tun: !!- -b !$weil !!-alles außer dem letzten Wort ist und !$das letzte Wort ist.
Darth Egregious
3

Du kannst:

$ ls -l
[..]
$ !:0* /tmp
[..]

Dies wird anrufen ls -l /tmp. Siehe die bashHandbuchseite:

   Word Designators
       Word designators are used to select desired words from the event.  A : separates the 
       event specification from the  word  designator.   It  may  be  omitted  if the word
       designator begins with a ^, $, *, -, or %.  Words are numbered from the beginning of
       the line, with the first word being denoted by 0 (zero).  Words are inserted into the
       current line separated by single spaces.

       0 (zero)
              The zeroth word.  For the shell, this is the command word.
       n      The nth word.
       ^      The first argument.  That is, word 1.
       $      The last argument.
       %      The word matched by the most recent `?string?' search.
       x-y    A range of words; `-y' abbreviates `0-y'.
       *      All of the words but the zeroth.  This is a synonym for `1-$'.  It is not an 
              error to use * if there is just one  word  in
              the event; the empty string is returned in that case.
       x*     Abbreviates x-$.
       x-     Abbreviates x-$ like x*, but omits the last word.

       If a word designator is supplied without an event specification, the previous command
       is used as the event.
Chaos
quelle
Besser zu beziehenman history
Costas
Das sieht vielversprechend aus, aber das Beispiel ist falsch herum. Wie gehst du von ls /tmpnach ls -l /tmp?
Moyli
1

Mit Bash können Sie schnell suchen und in Ihrer Eingabeaufforderung einen Befehl aus Ihrem Verlauf zurückerhalten, damit Sie ihn vor der Ausführung von Hand bearbeiten können.

An der Eingabeaufforderung:

  1. Drücken Sie Strg-R (wie in R everse): Die Eingabeaufforderung sollte ändern , um Ihnen mitzuteilen , dass Sie jetzt in Reversed - Modus befinden,
  2. Beginnen Sie einen Teil Ihres Befehl eingeben (in Ihrem Beispiel könnten Sie schreiben ls, tmpoder sogar mpzu Spiel ls tmp): der zuletzt verwendete Befehl Ihre Tastenanschläge entsprechen , werden angezeigt , während Sie tippen.
  3. Wenn Sie Ihren Befehl gefunden haben, geben Sie ihn einfach ein tab, um ihn in Ihre normale Eingabeaufforderung aufzunehmen: Er wird noch nicht ausgeführt. Er wartet hier auf Ihre Änderungen, z. B. das Hinzufügen, Entfernen oder Ändern von Parametern oder das Anwenden eines anderen Befehls auf die gleiche Datei usw.
WhiteWinterWolf
quelle
1
Durch Drücken der Eingabetaste wird der Befehl zumindest auf meinem System ausgelöst. Verwenden Sie stattdessen Tab ;)
John WH Smith
Vielen Dank, aber ich suche nach einer Möglichkeit, bei der der Befehl nicht erneut eingegeben wird.
Moyli
@ JohnWHSmith: Danke, Fehler korrigiert (ich habe derzeit keinen Bash zur Hand und am Ende wird es nur zu einem Reflex, also benutze ich den Verlauf, ohne zu überlegen, welche Taste ich tatsächlich drücke :))
WhiteWinterWolf
@Moyli Du musst irgendwie den richtigen Befehl erreichen. Wenn es das vorherige ist, drücken Sie einfach Upanstatt zu tippen !!. Wenn es sich um einen früheren Befehl handelt, drücken Sie Ctrl+R foostatt !foo(nicht genau derselbe, aber nahe genug).
Gilles 'SO - hör auf böse zu sein'
@ Gilles Die Voraussetzung ist, dass es der unmittelbar vorherige Befehl ist. Ich habe dies alles in der Frage erwähnt, einschließlich der Tatsache, dass ich nach einer Möglichkeit suche, bei der ich nicht erneut eingeben oder mich mit den Cursortasten bewegen muss. Die andere Antwort zeigt (fast), wie es geht, ohne den Befehl erneut einzugeben.
Moyli
0

Drücken Sie die folgenden Tasten, um den vorherigen Befehl mit einer Option zu starten, die unmittelbar nach dem Befehlsnamen hinzugefügt wurde:
Up Home Ctrl+ Right Space(geben Sie die Option ein)Enter

Wenn die Cursortasten auf Ihrem System nicht funktionieren, können Sie stattdessen die Emacs-Bewegungstasten verwenden:
Ctrl+ P Ctrl+ A Meta+ F Space(geben Sie die Option ein)Enter

Wenn der Befehlsname mehrere Wörter enthält (z. B. weil es sich um einen Pfad mit Schrägstrichen handelt), bewegt sich Ctrl+ Rightnur über den ersten Schrägstrich hinaus. Suchen Sie stattdessen das erste Leerzeichen.

Up Home Ctrl+ S Space Esc Space(geben Sie die Option ein) Enter
Ctrl+ P Ctrl+ A Ctrl+ S Space Esc Space(geben Sie die Option ein)Enter

Bei dieser Suche können Sie mit Up Upanstelle von Up Homeoder Ctrl+ P Ctrl+ Panstelle von Ctrl+ P Ctrl+ beginnen A. Die Anzahl der Tastendrücke ist gleich, aber die Eingabe ist etwas einfacher, aber weniger intuitiv.

Wenn Sie möchten, können Sie die Funktion zum Ersetzen des Verlaufs verwenden , bei der weniger Tastendrücke erforderlich sind, wenn der Befehl Schrägstriche enthält.
^ ^ --option
Beachten Sie das nachgestellte Leerzeichen nach der Option: Sie ersetzen das erste Leerzeichen im Befehl durch ein Leerzeichen, die neue Option und ein anderes Leerzeichen.

Gilles 'SO - hör auf böse zu sein'
quelle