$_
é dito ser o último argumento do comando anterior.
Então, eu me pergunto por que não é, EDITOR="emacs -nw"
mas EDITOR
no exemplo a seguir?
Por que não faz "emacs -nw"
parte do último argumento?
De maneira mais geral, quais são as definições de um argumento e o último argumento?
Obrigado.
$ export EDITOR="emacs -nw"
$ echo $_
EDITOR
EDITOR
é um argumento para exportarpdksh
edash
incluirá o valor que foi atribuído, masksh93
se comportará da mesmabash
forma.export FOO=bar; echo $_
imprimeexport
.export
ser um utilitário interno.typeset -x FOO=bar
depoisecho $_
imprimeFOO
, mas no Bashdeclare -x FOO=bar; echo $_
imprimeFOO=bar
.Respostas:
Bash processa atribuições de variáveis, quando eles estão autorizados como argumentos (com
alias
,declare
,export
,local
,readonly
, etypeset
), antes de mais nada (ou melhor, identifica-los antes de qualquer outra coisa - expansão se aplica aos valores atribuídos às variáveis). Quando se trata de expansão de palavras, o comando restante éexport EDITOR
, então_
é definido comoEDITOR
.De um modo geral, argumentos são as “palavras” restantes após a expansão (que não inclui atribuições e redirecionamentos de variáveis).
Consulte Expansão de comandos simples no manual do Bash para obter detalhes.
fonte
declare
o comportamento não coincide com o que estou descrevendo ...declare a=b; echo $_
impressõesa=b
;export c=d; echo $_
imprime apenasc
.alias
parece imprimir apenas o nome,local
por outro lado, imprime todo o argumento. Ereadonly
também imprime apenas o nome, o que achei um pouco surpreendente, já que eu pensariareadonly
elocal
seria semelhantedeclare
.export
ereadonly
são declarados em conjuntosetattr.def
,declare
,local
, etypeset
são declarados nodeclare.def
,alias
está sozinho noalias.def
.alias, declare, export, local, readonly
etypeset
. O que acontece primeiro e depois? "Quando se trata de expansão de palavras, o comando restante éexport EDITOR
", você implica que a atribuição de variávelEDITOR="emacs -nw"
ocorre antes da expansão? Caso contrário, por que o comando restante não contém a atribuição como argumento? Se sim, a expansão dos valores atribuídos às variáveis não precisa ocorrer antes de executar a atribuição das variáveis?TL; DR: No caso de
export FOO=bar
, o bash chama sua criação temporária de ambiente, defineFOO=bar
nesse ambiente e gera um comando final deexport FOO
. Nesse ponto,FOO
é considerado o último argumento.Ah, os muito abusados
$_
:Vejamos algumas variações:
Então, vemos três padrões aqui:
$_
é definido como o próprio nome do comando se não houver argumentos, caso contrário, o último dos argumentos apresentados.$_
não é modificado.$_
está definido como algo não muito esperado; esquisito.Eu instrumentei o código para fornecer algumas dicas sobre a estranheza.
Você pode ver que o analisador vê o último argumento esperado (
lastarg=
) em todos os casos, mas o que acontece depois depende do que o bash pensa que deve acontecer. Consulte execute_cmd.c, execute_simple_command () .No caso de
export FOO=bar
, o bash faz a atribuição e depois exporta a variável. Isso parece consistente com a afirmação da documentação de que o último argumento foi calculado após a expansão.fonte
MAILCHECK
Para responder à pergunta do título, tente
!$
:Isso é expansão da história. Na página de manual do bash:
...
...
...
...
...
...
fonte
export EDITOR="emacs -nw"
» consiste em duas palavras: a primeira é «export
» e a segunda é «EDITOR="emacs -nw"
». A questão é realmente perguntar: "O que a página de manual do bash e o Manual do Bash significam quando dizem que!_
'se expande para o último argumento do comando anterior', já que o bash é definido$_
como"EDITOR
"neste caso?" Copiar e colar a seção da página de manual do bash na expansão do histórico não é particularmente útil.