Grundsätzlich ist es das letzte Argument zum vorherigen Befehl.
!$ist das "Ende" des vorherigen Befehls. Betrachten Sie das folgende Beispiel: Wir beginnen mit der Suche nach einem Wort in einer Datei:
grep -i joe /some/long/directory/structure/user-lists/list-15
Wenn sich Joe in dieser Benutzerliste befindet, möchten wir ihn daraus entfernen. Wir können entweder vi mit diesem langen Verzeichnisbaum als Argument vi !$starten oder so einfach wie Which bash expand to:
vi /some/long/directory/structure/user-lists/list-15
( Quelle ; handliche Anleitung übrigens)
Es ist nichts wert, zwischen diesem !$Token und der speziellen Shell-Variablen zu unterscheiden $_. Tatsächlich werden beide zum letzten Argument des vorherigen Befehls erweitert. Wird !$jedoch während der Verlaufserweiterung erweitert , während $_sie während der Parametererweiterung erweitert wird . Eine wichtige Folge davon ist, dass !$der erweiterte Befehl bei Verwendung in Ihrem Verlauf gespeichert wird.
Betrachten Sie beispielsweise die Tastenanschläge
(Die einzigen Zeichen, die geändert werden, sind das $!und $_in der Mitte.)
Wenn Sie im ersten Fall drücken Up, wird in der Befehlszeile Folgendes angezeigt echo Foo Jar: Die letzte in stdout geschriebene Zeile lautet Foo Jar.
Wenn Sie in letzterem Fall drücken Up, wird in der Befehlszeile Folgendes angezeigt echo $_ bar, jedoch $_mit einem anderen Wert als zuvor. In der Tat $_ist dies jetzt Jarder Fall, sodass die letzte in stdout geschriebene Zeile lautet Jar Jar.
Eine weitere Konsequenz ist, dass _bei anderen Parametererweiterungen beispielsweise die Befehlsfolge verwendet werden kann
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
druckt isomorphism isosceles. Aber es gibt keine " ${!$%morphism}" analoge Erweiterung.
Weitere Informationen zu den Expansionsphasen in Bash finden Sie im EXPANSIONAbschnitt von man 1 bash( in der Online-Ausgabe heißt dies Shell Expansions ). Der HISTORY EXPANSIONAbschnitt ist getrennt.
echoetwas zu versuchen, wenn Sie nicht sicher sind, was es tun wird.