Zasadniczo jest to ostatni argument do poprzedniego polecenia.
!$
jest „końcem” poprzedniego polecenia. Rozważ następujący przykład: Zaczynamy od szukania słowa w pliku:
grep -i joe /some/long/directory/structure/user-lists/list-15
jeśli Joe jest na tej liście użytkowników, chcemy go z niego usunąć. Możemy wystrzelić vi z tym długim drzewem katalogów jako argumentem lub tak prosto, jak vi !$
Rozwijanie bash do:
vi /some/long/directory/structure/user-lists/list-15
( Źródło ; poręczny przewodnik, przy okazji)
Nie warto nic odróżniać od tego !$
tokena od specjalnej zmiennej powłoki $_
. Rzeczywiście, oba rozwijają się do ostatniego argumentu poprzedniego polecenia. Jednak !$
jest rozszerzany podczas rozszerzania historii , natomiast $_
jest rozszerzany podczas rozszerzania parametrów . Jedną z ważnych konsekwencji tego jest to, że kiedy używasz !$
, rozszerzone polecenie jest zapisywane w twojej historii.
Weźmy na przykład naciśnięcia klawiszy
(Jedyne zmienione znaki to $!
i $_
na środku.)
W pierwszym przypadku, gdy naciśniesz Up, wiersz poleceń czyta echo Foo Jar
, więc ostatni wiersz zapisany na stdout to Foo Jar
.
W drugim przypadku, gdy naciśniesz Up, linia poleceń czyta echo $_ bar
, ale teraz $_
ma inną wartość niż poprzednio - rzeczywiście $_
jest teraz Jar
, więc ostatni wiersz zapisany na stdout to Jar Jar
.
Inną konsekwencją jest to, że _
można go użyć w innych rozszerzeniach parametrów, na przykład w sekwencji poleceń
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
odbitki isomorphism isosceles
. Ale nie ma analogicznego ${!$%morphism}
rozszerzenia.
Aby uzyskać więcej informacji na temat faz ekspansji w Bash, zobacz EXPANSION
sekcję man 1 bash
(nazywa się to Shell Expansions w wydaniu online). HISTORY EXPANSION
Sekcji jest oddzielona.
echo
czegoś, jeśli nie jesteś pewien, co to zrobi.