¿Podría explicar las siguientes oraciones del manual de Bash sobre $_? , especialmente las partes en negrita, ¿tal vez con algunos ejemplos?
Al iniciar el shell, establezca la ruta de acceso absoluta utilizada para
invocar el shell o el script de shell que se está ejecutando como pasado en el entorno
o lista de argumentos .Posteriormente , se expande hasta el último argumento del comando anterior
, después de la expansión.También establezca la ruta de acceso completa utilizada para invocar cada
comando ejecutado y colocado en el entorno exportado a ese comando .Al revisar el correo , este parámetro contiene el nombre del archivo de correo.
Respuesta aceptada:
Estoy de acuerdo en que no está muy claro.
1. Al iniciar el shell,
-
si el
_variable estaba en el entorno quebashrecibido , luegobashlo deja intacto.En particular, si ese
bashShell fue invocado por otrobashshell (aunquezsh,yashy algo dekshlas implementaciones también lo hacen
), entonces esobashshell habrá establecido el_variable de entorno
a la ruta del comando que se está ejecutando (ese es el tercer punto
en su pregunta). Por ejemplo, sibashse invoca para
interpretar un script como resultado de otrobashintérprete de shell:bash-script some argsEse
bashhabrá pasado_=/path/to/bash-scripen el entorno
dado abash-script, y ese es el valor inicial
del$_bashla variable estará en elbashshell que
interpreta ese script.$ env -i _=whatever bash -c 'echo "$_"' whatever -
Ahora, si la aplicación que invoca no pasa un
_entorno
variable , elbashinvocado shell inicializará$_alargv[0]se recibe
a sí mismo, lo que podría serbash, o/path/to/basho/path/to/some-scripto cualquier otra cosa (en el ejemplo anterior, eso
sería/bin/bashsi el she-bang del guión fuera#! /bin/basho/path/to/bash-scriptdependiendo del
sistema).Entonces, ese texto es engañoso, ya que describe el comportamiento de la persona que llama
quebashno tiene control sobre. La aplicación que invocóbashes muy posible que no establezca$_en absoluto (en la práctica, solo algunos
shells y algunas aplicaciones interactivas raras lo hacen,execlp()no
por ejemplo), o podría usarlo para algo completamente diferente
(por ejemplo,ksh93lo establece en*pid*/path/to/command).$ env bash -c 'echo "$_"' /usr/bin/env (env did not set it to /bin/bash, so the value we get is the one passed to env by my interactive shell) $ ksh93 -c 'bash -c "echo $_"' *20042*/bin/bash
2. Posteriormente
El Posteriormente tampoco es muy claro. En la práctica, eso es tan pronto como bash interpreta un comando simple en el entorno de shell actual.
-
En el caso de un shell interactivo , que estará en el primer comando simple interpretado desde
/etc/bash.bashrcpor ejemplo.Por ejemplo, en el indicador de un shell interactivo:
$ echo "$_" ] (the last arg of the last command from my ~/.bashrc) $ f() { echo test; } $ echo "$_" ] (the command-line before had no simple command, so we get the last argument of that previous echo commandline) $ (: test) $ echo "$_" ] (simple command, but in a sub-shell environment) $ : test $ echo "$_" test -
Para un shell no interactivo , sería el primer comando en
$BASH_ENVo del código alimentado a ese shell si$BASH_ENVno está
configurado.
3. Cuando Bash ejecuta un comando
El tercer punto es algo diferente y se insinúa en la discusión anterior.
bash , como algunos otros shells pasarán un _ variable de entorno a los comandos que ejecuta que contiene la ruta que bash utilizado como el primer argumento del execve() llamadas al sistema.
$ env | grep '^_'
_=/usr/bin/env
4. Al revisar el correo
El cuarto punto se describe con más detalle en la descripción del MAILPATH variables:
'RUTA DE CORREO'
Una lista separada por dos puntos de nombres de archivo que el shell periódicamente
comprueba si hay correo nuevo .
Cada entrada de la lista puede especificar el mensaje que
se imprime cuando llega correo nuevo en el archivo de correo separando el
nombre de archivo del mensaje con un '?'.
Cuando se usa en el texto del
mensaje, '$_' se expande al nombre del archivo de correo actual.
Ejemplo:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>