¿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 quebash
recibido , luegobash
lo deja intacto.En particular, si ese
bash
Shell fue invocado por otrobash
shell (aunquezsh
,yash
y algo deksh
las implementaciones también lo hacen
), entonces esobash
shell 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, sibash
se invoca para
interpretar un script como resultado de otrobash
intérprete de shell:bash-script some args
Ese
bash
habrá pasado_=/path/to/bash-scrip
en el entorno
dado abash-script
, y ese es el valor inicial
del$_
bash
la variable estará en elbash
shell que
interpreta ese script.$ env -i _=whatever bash -c 'echo "$_"' whatever
-
Ahora, si la aplicación que invoca no pasa un
_
entorno
variable , elbash
invocado shell inicializará$_
alargv[0]
se recibe
a sí mismo, lo que podría serbash
, o/path/to/bash
o/path/to/some-script
o cualquier otra cosa (en el ejemplo anterior, eso
sería/bin/bash
si el she-bang del guión fuera#! /bin/bash
o/path/to/bash-script
dependiendo del
sistema).Entonces, ese texto es engañoso, ya que describe el comportamiento de la persona que llama
quebash
no tiene control sobre. La aplicación que invocóbash
es 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,ksh93
lo 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.bashrc
por 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_ENV
o del código alimentado a ese shell si$BASH_ENV
no 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>