По сути, это последний аргумент предыдущей команды.
!$
это «конец» предыдущей команды. Рассмотрим следующий пример. Начнем с поиска слова в файле:
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
что-то сделать, если вы не уверены, что это будет делать.