Вопрос о специальных переменных. Документация гласит:
!!:$
обозначает последний аргумент предыдущей команды . Это может быть сокращено до! $.
(
$_
подчеркивание.) При запуске оболочки задайте абсолютный путь, используемый для вызова оболочки или сценария оболочки, выполняемого в том виде, как он был передан в среде или списке аргументов. Впоследствии, расширяется до последнего аргумента предыдущей команды после раскрытия. Также задайте полный путь, используемый для вызова каждой команды, выполненной и помещенной в среду, экспортированную в эту команду.
Должна быть какая-то разница, которую я не могу уловить, потому что:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
В чем разница?
$_
$_
!$
Ответы:
!$
это слово, обозначающее расширение истории, оно расширяется до последнего слова предыдущей команды в истории . IOW, последнее слово предыдущей записи в истории. Это слово обычно является последним аргументом команды, но не в случае перенаправления. В:вся команда
'echo "hello" > /tmp/a.txt'
появилась в истории и/tmp/a.txt
является последним словом этой команды._
является параметром оболочки, он расширяется до последнего аргумента предыдущей команды. Здесь перенаправление не является частью аргументов, передаваемых команде, поэтомуhello
передается только аргументecho
. Вот почему$_
расширили доhello
._
больше не является одним из стандартных специальных параметров оболочки . Он работает вbash
,zsh
,mksh
иdash
только тогда , когда интерактивными,ksh93
только тогда , когда две команды находятся на разнесенных линии:источник
!$
расширения против$_
параметра является то, что онecho $_
всегда отображается в истории какecho $_
, аecho !$
показывает значение, до которого он был расширен. Например ,echo one two
тогдаecho !$
, то нажатие на шоуecho two
.