По сути, это последний аргумент предыдущей команды.
!$это «конец» предыдущей команды. Рассмотрим следующий пример. Начнем с поиска слова в файле:
grep -i joe /some/long/directory/structure/user-lists/list-15
Если Джо в этом списке пользователей, мы хотим удалить его из него. Мы можем либо запустить vi с этим длинным деревом каталогов в качестве аргумента, либо так же просто, как vi !$расширение bash:
vi /some/long/directory/structure/user-lists/list-15
( источник ; кстати, удобный справочник)
Ничего не стоит разграничивать этот !$токен и специальную переменную оболочки $_. Действительно, оба расширяются до последнего аргумента предыдущей команды. Однако !$расширяется при расширении истории , а $_расширяется при расширении параметров . Одним из важных следствий этого является то, что при использовании !$, то расширенная команда сохраняется в истории.
Например, рассмотрим нажатия клавиш
(Изменены только символы $!и $_в середине.)
В первом случае, когда вы нажимаете Up, командная строка читает echo Foo Jar, поэтому последняя строка записывается в stdout Foo Jar.
В последнем случае, когда вы нажимаете Up, командная строка читает echo $_ bar, но теперь $_имеет значение, отличное от того, что было раньше - на самом деле, $_сейчас Jar, поэтому последняя строка, записанная в stdout - это Jar Jar.
Другим следствием является то, что _могут использоваться другие расширения параметров, например, последовательность команд
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
отпечатки isomorphism isosceles. Но нет аналогичного " ${!$%morphism}" расширения.
Для получения дополнительной информации о фазах расширения в Bash см. EXPANSIONРаздел man 1 bash(это называется Shell Expansions в онлайн-издании). HISTORY EXPANSIONРаздел отдельно.
echoчто-то сделать, если вы не уверены, что это будет делать.