$_ se dice que es el último argumento del comando anterior.
Entonces, me pregunto por qué no lo es, EDITOR="emacs -nw"pero EDITORen 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

EDITORes un argumento para exportarpdkshedashincluirá el valor asignado, peroksh93se comportará como lobashhace.export FOO=bar; echo $_impresionesexport.exportes una utilidad incorporada.typeset -x FOO=barluegoecho $_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.aliasparece imprimir solo el nombre,localpor otro lado imprime todo el argumento. Yreadonlytambién imprime solo el nombre, lo que me pareció un poco sorprendente ya que habría pensadoreadonlyylocalsería similar adeclare.exportyreadonlyse declaran juntos ensetattr.def,declare,local, ytypesetse declaran endeclare.def,aliasse encuentra solo enalias.def.alias, declare, export, local, readonlyytypeset. ¿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=baren ese entorno y luego produce un comando final deexport FOO. En ese punto,FOOse 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
MAILCHECKPara 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.