$_
se dice que es el último argumento del comando anterior.
Entonces, me pregunto por qué no lo es, EDITOR="emacs -nw"
pero EDITOR
en el siguiente ejemplo.
¿Por qué no es "emacs -nw"
parte del último argumento?
En términos más generales, ¿cuáles son las definiciones de un argumento y el último argumento?
Gracias.
$ export EDITOR="emacs -nw"
$ echo $_
EDITOR
EDITOR
es un argumento para exportarpdksh
edash
incluirá el valor asignado, peroksh93
se comportará como lobash
hace.export FOO=bar; echo $_
impresionesexport
.export
es una utilidad incorporada.typeset -x FOO=bar
luegoecho $_
imprimeFOO
, pero en Bashdeclare -x FOO=bar; echo $_
imprimeFOO=bar
.Respuestas:
Bash procesa las asignaciones de variables, cuando se les pueden utilizarse como argumentos (con
alias
,declare
,export
,local
,readonly
, ytypeset
), antes que nada (o más bien, que los identifica ante todo - la expansión se aplica a los valores asignados a las variables). Cuando se trata de la expansión de palabras, el comando restante esexport EDITOR
, por lo que_
se establece enEDITOR
.En términos generales, los argumentos son las "palabras" que quedan después de la expansión (que no incluye asignaciones variables y redirecciones).
Vea Expansión de comandos simples en el manual de Bash para más detalles.
fuente
declare
's comportamiento no coincide con lo que estoy describiendo ...declare a=b; echo $_
impresionesa=b
;export c=d; echo $_
impresiones soloc
.alias
parece imprimir solo el nombre,local
por otro lado imprime todo el argumento. Yreadonly
también imprime solo el nombre, lo que me pareció un poco sorprendente ya que habría pensadoreadonly
ylocal
sería similar adeclare
.export
yreadonly
se declaran juntos ensetattr.def
,declare
,local
, ytypeset
se declaran endeclare.def
,alias
se encuentra solo enalias.def
.alias, declare, export, local, readonly
ytypeset
. ¿Qué pasa primero y después? "Cuando se trata de la expansión de palabras, el comando restante esexport EDITOR
", ¿implica que la asignación de variablesEDITOR="emacs -nw"
ocurre antes de la expansión? Si no, ¿por qué el comando restante no contiene la asignación como argumento? En caso afirmativo, ¿no tiene que ocurrir la expansión de los valores asignados a las variables antes de realizar la asignación de variables?TL; DR: en el caso de
export FOO=bar
, bash invoca la creación de su entorno temporal, se estableceFOO=bar
en ese entorno y luego produce un comando final deexport FOO
. En ese punto,FOO
se toma como último argumento.Ah, el muy maltratado
$_
:Veamos algunas variaciones:
Entonces vemos tres patrones aquí:
$_
se configura con el nombre del comando en sí mismo si no hay argumentos; de lo contrario, el último de los argumentos presentados.$_
no se modifica.$_
se establece en algo que no se espera del todo; extraño.He instrumentado el código para proporcionar una idea de la rareza.
Puede ver que el analizador ve el último argumento esperado (
lastarg=
) en todos los casos, pero lo que sucede a partir de entonces depende de lo que bash piense que debería suceder. Ver execute_cmd.c, execute_simple_command () .En el caso de
export FOO=bar
, bash realiza la asignación y luego exporta la variable. Esto parece coherente con la afirmación de la documentación de que el último argumento se calculó después de la expansión.fuente
MAILCHECK
Para responder la pregunta del título, intente
!$
:Esta es la expansión de la historia. Desde la página de manual de bash:
...
...
...
...
...
...
fuente
export EDITOR="emacs -nw"
» consta de dos palabras: la primera es «export
» y la segunda es «EDITOR="emacs -nw"
». La pregunta realmente es: "¿Qué significan la página de manual de bash y el Manual de Bash cuando dicen que!_
'se expande hasta el último argumento del comando anterior', dado que bash se establece$_
en«EDITOR
»en este caso? Copiar y pegar la sección de la página man de bash sobre la expansión del historial no es particularmente útil.