Wie kann ich mich an das Argument des vorherigen Bash-Befehls erinnern?

312

Gibt es in Bash eine Möglichkeit, sich an das Argument des vorherigen Befehls zu erinnern?

Normalerweise vi file.cfolge ich gefolgt von gcc file.c.

Gibt es in Bash eine Möglichkeit, sich an das Argument des vorherigen Befehls zu erinnern?

Der Codierer
quelle
2
Mögliches Duplikat: stackoverflow.com/questions/4009412/…
eugenevd

Antworten:

562

Sie können das letzte Argument des vorherigen Befehls verwenden $_oder !$abrufen.

Auch Alt + .kann verwendet werden , um das letzte Argument von einem der vorhergehenden Befehle wieder zu verwenden .

Codaddict
quelle
121
Auch, wenn Sie ein beliebiges Argument möchten, können Sie verwenden !!:1, !!:2usw. ( !!:0wird der vorherige Befehl selbst.) Siehe gnu.org/software/bash/manual/bashref.html#History-Interaction
janmoesen
41
Ähnlich !$verwenden Sie !^für das erste Argument.
Will
13
ahh ... * nix ... du bist eine Sache der Schönheit ... jeden Tag liebe ich dich mehr
jx12345
Wie können wir uns auf das vorletzte Argument des vorherigen Befehls beziehen? Wenn ich zum Beispiel gegeben habe echo tiger rabbit, wie kann ich auf tigerden folgenden Befehl verweisen ?
Chan Kim
3
Alt + .funktioniert nicht im vi-Modus. Nur zu Ihrer Information, für andere, die hier verwirrt waren.
Brian McCutchon
160

Wenn der vorherige Befehl zwei Argumente hatte, wie folgt

ls a.txt b.txt

und du wolltest den ersten, den du tippen könntest

!:1

geben

a.txt

Oder wenn Sie beides möchten, können Sie tippen

!:1-2

geben

a.txt b.txt

Sie können dies auf eine beliebige Anzahl von Argumenten erweitern, z.

!:10-12
Robert Gowland
quelle
@RNA, ich habe es nur noch einmal versucht, um sicherzustellen, dass ich keinen Tippfehler eingefügt habe. Können Sie etwas mehr Details angeben (z. B. Ubuntu-Befehlszeile, Cygwin für Windows? Fehlermeldung? Vorherige Zeile?)
Robert Gowland
Ich verwende GNU Bash, Version 3.2.51 (1) -Veröffentlichung (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. Die Fehlermeldung lautet-bash: :1-2: bad word specifier
RNA
2
Ich bekomme das Gleiche, wenn es in der vorherigen Zeile nicht zwei Argumente gab. Z.B. Zeile 1 ls a.txtZeile 2ll !:1-2
Robert Gowland
Du hast recht. Das ist ein dummer Fehler, den ich gemacht habe. Vielen Dank!
RNA
Auch um alle Argumente zu erhalten, !:^-$kann verwendet werden oder natürlich ähnlicher Code in Kombination mit Zahlen.
816-8055
88

!!:nWo nist die 0-basierte Position des gewünschten Arguments?

Zum Beispiel:

echo 'one' 'two'
# "one two"

echo !!:2
# "two"

Das !Präfix wird verwendet, um auf vorherige Befehle zuzugreifen.

Andere nützliche Befehle:

  • !$ - letztes Argument vom vorherigen Befehl
  • !^ - erstes Argument (nach dem Programm / eingebauten / Skript) aus dem vorherigen Befehl
  • !! - vorheriger Befehl (oft ausgesprochen "Bang Bang")
  • !n- Befehlsnummer nvonhistory
  • !pattern - Letzte Befehlsübereinstimmung pattern
  • !!:s/find/replace- letzter Befehl, ersetzen finddurchreplace

Weitere Informationen zum Befehlsverlauf

Johntron
quelle
7
Stattdessen !!:s/find/replacekönnen Sie auch ^find^replace.
Big McLargeHuge
Außerdem: !* - alle Argumente aus dem vorherigen Befehl (nach dem Programm / integriert / Skript). zB: ls *.tmp *.cache rm !*
Aphoid
68

In der Kommandozeile können Sie esc- .oder alt+ drücken.

Es durchläuft das letzte Argument Ihrer vorherigen Befehle.

Antonio Mano
quelle
Ich habe immer die und Schlüssel gefunden, um auch zu funktionieren.
Bucket
@ Bucket Schlüssel gehen durch vorherige Befehle, während die von Antonio bereitgestellte Lösung erlaubt, vorherige Argumente durchzugehen (letztes Argument jedes vorherigen Befehls nur)
everyonesdesign
30

Wenn Sie die im Verlauf für einen bestimmten Befehl angegebene Nummer kennen, können Sie so ziemlich jedes Argument in diesem Befehl mit den folgenden Begriffen verwenden.

Verwenden Sie Folgendes, um das zweite Argument aus dem dritten Befehl im Verlauf zu übernehmen:

!3:2

Verwenden Sie Folgendes, um das dritte Argument aus dem fünftletzten Befehl in der Historie zu übernehmen:

!-5:3

Mit einem Minuszeichen fordern Sie es auf, vom letzten Befehl des Verlaufs zu wechseln.

Madisz
quelle
19

! * führt einen neuen Befehl mit allen vorherigen Argumenten aus.

ls /tmp
cd !*
#you are now in /tmp

quelle
Dies funktionierte bei OSX nicht - musste $_stattdessen verwendet werden.
Mike W
16

Ja, Sie können !$das letzte Argument des vorhergehenden Befehls abrufen.

Justin Ethier
quelle
Beachten Sie das Schlüsselwort "last", insbesondere wenn Ihr Befehl mehrere Argumente enthielt.
Bucket