Wie kann ich ein bestimmtes Argument aus einem vorherigen Befehl in Bash abrufen?

31

In bash können Sie !*alle Argumente aus dem vorherigen Befehl abrufen. Wenn Sie dies zum Beispiel getan haben cp /some/path /some/other/pathund dann getan haben mv !*, wird der zweite Befehl auf erweitert mv /some/path /some/other/path.

Gibt es so etwas, das verwendet werden kann, um von einem Befehl aus auf ein bestimmtes Argument zuzugreifen, anstatt auf alle?

Wuffers
quelle

Antworten:

38

In !*, !ist die Geschichte Expansion Präfix und *ist das Wort Bezeichner das bedeutet alle Argumente. Sie können sich die allgemeine Syntax als Bang-Line-Colon-Spalte ( !Zeilenspalte :) merken . Es gibt viele mögliche Verknüpfungen: Die Standardzeile ist die vorherige Zeile, der Standardspaltenbezeichner ist "all", und Sie können den Doppelpunkt weglassen, wenn der Spaltenbezeichner nicht numerisch ist (dies !3würde jedoch Zeile 3 bedeuten). Sie verwenden können , !:0um die Befehlsnamen beziehen, !:1, !:2usw, um aufeinanderfolgende Argumente zu beziehen, !:$für das letzte Wort, !:*für alle Argumente und mehr.

Siehe auch diesen Beitrag von Michael Mrozek bei Unix Stack Exchange .

Gilles 'SO - hör auf böse zu sein'
quelle
1
Ich habe es selbst versucht und das hat aber nicht funktioniert. Nach einem Blick auf den Beitrag von Michale Mrozek, sagt sie Gebrauch !:1, !:2. Nachdem die Version mit den Doppelpunkten verwendet wurde, funktionierte es.
Wuffers
@MrMan: Hoppla, richtig, wenn Sie den Doppelpunkt mit einer Nummer weglassen, wird die Nummer als Zeilennummer interpretiert. Das tut mir leid.
Gilles 'SO- hör auf böse zu sein'
Kein Problem. Dann gehe ich also davon aus, dass "doing" !1:1auf das erste Argument der ersten Zeile hindeuten würde?
Wuffers
4

Persönlich mag ich diese „Erweiterung mit Ausrufezeichen“ -Funktion nicht besonders, die selbst dann stört, wenn Sie echo "Hello World!"interaktive Shells ausprobieren (so dass die Beschaffung von Skripten, die davon ausgehen, dass sie im nicht interaktiven Modus ausgeführt werden, überhaupt nicht funktioniert).

Also setze ich set +o histexpandArgumente und rufe sie mit der folgenden Methode auf:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

Beachten Sie, dass der Esc-Trick darin besteht, dass ich keinen Metaschlüssel habe.

Benoit
quelle
Ich benutze fast nie Ausrufezeichen in Befehlen. Die Ausrufezeichenmethode funktioniert also perfekt für mich.
Wuffers
Dann genieße es. Viele der zahlreichen Funktionen Ihrer Shell sind nur für wenige Benutzer gedacht.
Benoit
Eigentlich müssen Sie Ausrufezeichen nicht umgehen. Tun echo 'Hello, orld!'. Beachten Sie die einfachen Anführungszeichen anstelle der doppelten.
Wuffers 30.11.10