Die Frage bezieht sich auf spezielle Variablen. Dokumentation sagt:
!!:$
bezeichnet das letzte Argument des vorhergehenden Befehls . Dies kann
zu !$
abgekürzt werden .
($_
, ein Unterstrich.) Beim Start der Shell auf den absoluten Pfadnamen setzen, der verwendet wird, um die Shell oder das Shell-Skript aufzurufen, das ausgeführt wird, wie in der
Umgebung oder Argumentliste übergeben. Erweitert anschließend zum letzten Argument des vorherigen Befehls nach Ausbau. Auch auf den vollständigen Pfadnamen gesetzt, der verwendet wird, um jeden Befehl aufzurufen, der ausgeführt und in die Umgebung
platziert wird, die in diesen Befehl exportiert wird.
Es muss einen Unterschied geben, den ich nicht erkennen kann, denn:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
Was ist der Unterschied?
Akzeptierte Antwort:
!$
ist ein Wortbezeichner der Verlaufserweiterung, er erweitert sich zum letzten Wort des vorherigen Befehls im Verlauf . IOW, das letzte Wort des vorherigen Eintrags in der Geschichte. Dieses Wort ist normalerweise das letzte Argument für den Befehl, aber nicht im Falle einer Umleitung. In:
echo "hello" > /tmp/a.txt
der ganze Befehl 'echo "hello" > /tmp/a.txt'
erschien im Verlauf und /tmp/a.txt
ist das letzte Wort dieses Befehls.
_
ein Shell-Parameter ist, wird er zum letzten Argument des vorherigen Befehls erweitert. Hier ist die Umleitung kein Teil der Argumente, die an den Befehl übergeben werden, also nur hello
ist das an echo
übergebene Argument . Deshalb $_
erweitert zu hello
.
_
ist nicht mehr einer der Shell-Standard-Sonderparameter. Es funktioniert in bash
, zsh
, mksh
und dash
nur wenn interaktiv, ksh93
nur wenn zwei Befehle in getrennten Zeilen stehen:
$ echo 1 && echo $_
1
/usr/bin/ksh
$ echo 1
1
$ echo $_
1