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

5864
Wuffers

In Bash können Sie !*alle Argumente des vorherigen Befehls abrufen. Wenn Sie dies 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 auf ein bestimmtes Argument von einem Befehl statt auf alle zuzugreifen?

30

2 Antworten auf die Frage

36
Gilles

In !*, !ist die Geschichte Expansion Präfix und *ist das Wort Bezeichner, die alle Argumente bedeutet. Sie können die allgemeine Syntax als Zweipunktspalte ( !Zeilenspalte :) speichern . 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 ( !3würde aber 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 .

Ich habe es selbst ausprobiert und das hat nicht funktioniert. Nach einem Blick auf den Beitrag von Michale Mrozek sagt er, dass er "!: 1", "!: 2" verwenden soll. Nachdem die Version mit den Doppelpunkten verwendet wurde, funktionierte es. Wuffers vor 13 Jahren 1
@MrMan: Hoppla, richtig, wenn Sie den Doppelpunkt mit einer Zahl belassen, wird die Zahl als Zeilennummer interpretiert. Das tut mir leid. Gilles vor 13 Jahren 0
Kein Problem. Dann gehe ich davon aus, dass das Ausführen von "! 1: 1" auf das erste Argument der ersten Zeile verweist. Wuffers vor 13 Jahren 0
4
Benoit

Ich persönlich mag diese Funktion "Erweiterung mit Ausrufezeichen" wirklich nicht, die sogar stört, wenn Sie echo "Hello World!"interaktive Shells ausprobieren (Sourcing-Skripts, die davon ausgehen, dass sie im nicht-interaktiven Modus ausgeführt werden, funktionieren jedoch überhaupt nicht).

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

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

Beachten Sie, dass der Esc-Trick darauf zurückzuführen ist, dass ich keinen Metaschlüssel habe.

Ich verwende fast nie Ausrufezeichen in Befehlen. Die Ausrufezeichenmethode funktioniert also perfekt für mich. Wuffers vor 13 Jahren 0
Dann genieße es. Viele der zahlreichen Funktionen Ihrer Shell sind nur für wenige Benutzer gedacht. Benoit vor 13 Jahren 0
Eigentlich müssen Sie keine Ausrufezeichen entziehen. Mach 'echo' Hallo, orld! ' Beachten Sie die einfachen Anführungszeichen anstelle der doppelten Anführungszeichen. Wuffers vor 13 Jahren 0