Die Frage betrifft spezielle Variablen. Dokumentation sagt:
!!:$
bezeichnet das letzte Argument des vorhergehenden Befehls . Dies kann auf! $ Gekürzt werden.
(
$_
, ein Unterstrich.) Legen Sie beim Starten der Shell den absoluten Pfadnamen fest, der zum Aufrufen der Shell oder des Shell-Skripts verwendet wird, die bzw. das in der Umgebungs- oder Argumentliste übergeben wird. Anschließend wird nach der Erweiterung bis zum letzten Argument des vorherigen Befehls erweitert. Stellen Sie auch den vollständigen Pfadnamen ein, der zum Aufrufen aller ausgeführten und in die für diesen Befehl exportierte Umgebung platzierten Befehle verwendet wird.
Es muss einen Unterschied geben, den ich nicht fangen kann, weil:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
Was ist der Unterschied?
bash
shell
history-expansion
Webstuhl
quelle
quelle
$_
. Das ist entscheidend. Es erklärt vielleicht nicht den Unterschied, der Sie verwirrt, aber es erklärt eine Reihe anderer Möglichkeiten$_
und!$
ist nicht dasselbe.Antworten:
!$
ist ein Wortbezeichner für die Erweiterung der Geschichte. Es wird bis zum letzten Wort des vorherigen Befehls in der Geschichte erweitert . IOW, das letzte Wort des vorherigen Eintrags in der Geschichte. Dieses Wort ist normalerweise das letzte zu befehlende Argument, jedoch nicht im Falle einer Umleitung. Im:Der gesamte Befehl
'echo "hello" > /tmp/a.txt'
erschien in der Geschichte und/tmp/a.txt
ist das letzte Wort dieses Befehls._
ist ein Shell-Parameter, der bis zum letzten Argument des vorherigen Befehls erweitert wird. Hier ist die Umleitung kein Teil der Argumente, die an den Befehl übergeben werden, sondern nurhello
das Argument, an das übergeben wirdecho
. Deshalb$_
erweitert umhello
._
ist nicht mehr einer der speziellen Shell-Standardparameter . Es funktioniert inbash
,zsh
,mksh
unddash
nur dann , wenn interaktiven,ksh93
nur dann , wenn zwei Befehle sind auf getrennte Linien:quelle
!$
Expansion vs$_
Parameter ist, dassecho $_
in der Historie immer als angezeigt wirdecho $_
, währendecho !$
der Wert angezeigt wird, auf den es erweitert wurde. ZBecho one two
dannecho !$
dann hochdrücken zeigtecho two
.