$_
называется последним аргументом предыдущей команды.
Так что мне интересно, почему это не так, EDITOR="emacs -nw"
но EDITOR
в следующем примере?
Почему не "emacs -nw"
часть последнего аргумента?
В более общем смысле, каковы определения аргумента и последнего аргумента?
Благодарю.
$ export EDITOR="emacs -nw"
$ echo $_
EDITOR
EDITOR
аргумент для экспортаpdksh
иdash
будет включать в себя значение, которое было назначено, ноksh93
будет вести себя какbash
и.export FOO=bar; echo $_
печатаетexport
.export
это встроенная утилита.typeset -x FOO=bar
затемecho $_
печатаетFOO
, но в Bashdeclare -x FOO=bar; echo $_
печатаетFOO=bar
.Ответы:
Bash обрабатывает присвоения переменных, когда они допускаются в качестве аргументов (с
alias
,declare
,export
,local
,readonly
, иtypeset
), прежде чем что - либо (или , скорее, он идентифицирует их , прежде чем что - либо другое - расширение относится к значениям , назначенные переменным). Когда дело доходит до раскрытия слова, оставшаяся командаexport EDITOR
, поэтому_
, устанавливается наEDITOR
.Вообще говоря, аргументы - это «слова», оставшиеся после раскрытия (которое не включает присваивание переменных и перенаправления).
Подробности смотрите в разделе Простое расширение команд в руководстве по Bash.
источник
declare
что поведение не соответствует тому, что я описываю ...declare a=b; echo $_
отпечаткиa=b
;export c=d; echo $_
печатает простоc
.alias
кажется, печатает только имя,local
с другой стороны, печатает весь аргумент. Аreadonly
также печатает только имя, которое я нахожу немного удивительным, так как я бы подумал,readonly
иlocal
будет похоже наdeclare
.export
иreadonly
объявляются вместеsetattr.def
,declare
,local
иtypeset
объявлены вdeclare.def
,alias
стоит особняком вalias.def
.alias, declare, export, local, readonly
иtypeset
. Что происходит первым и следующим? «Когда дело доходит до раскрытия слова, остальной командой являетсяexport EDITOR
», подразумеваете ли вы, что присвоение переменнойEDITOR="emacs -nw"
происходит до раскрытия? Если нет, то почему оставшаяся команда не содержит присваивание в качестве аргумента? Если да, не должно ли произойти раскрытие значений, назначенных переменным, перед выполнением присваивания переменной?TL; DR: В случае
export FOO=bar
bash вызывает создание своего временного окружения, устанавливает егоFOO=bar
в этом окружении, а затем выдает окончательную командуexport FOO
. В этот моментFOO
принимается за последний аргумент.Ах, много-злоупотребляли
$_
:Давайте посмотрим на несколько вариантов:
Итак, мы видим три модели здесь:
$_
устанавливается само имя команды, если аргументов нет, в противном случае последний из представленных аргументов.$_
не изменяется.$_
настроено на что-то не совсем ожидаемое; странно.Я инструктировал код, чтобы дать некоторое представление о странности.
Вы можете видеть, что парсер видит ожидаемый последний аргумент (
lastarg=
) во всех случаях, но то, что произойдет после этого, зависит от того, что думает Bash. Смотрите execute_cmd.c, execute_simple_command () .В случае
export FOO=bar
bash выполняет присваивание, а затем экспортирует переменную. Это похоже на утверждение документации о том, что последний аргумент вычисляется после расширения.источник
MAILCHECK
Чтобы ответить на заглавный вопрос, попробуйте
!$
:Это расширение истории. Из справочной страницы bash:
...
...
...
...
...
...
источник
export EDITOR="emacs -nw"
» состоит из двух слов: первое - «export
», а второе - «EDITOR="emacs -nw"
». На самом деле возникает вопрос: «Что означают страница руководства по bash и руководство по Bash, когда они говорят, что!_
« расширяется до последнего аргумента предыдущей команды », учитывая, что в этом случае bash устанавливает$_
«EDITOR
»?» Копирование и вставка раздела справочной страницы bash по расширению истории не особенно полезны.