Estoy de acuerdo, no está muy claro.
1. Al iniciar el shell,
si la _variable estaba en el entorno que la bashrecibió , la bashdeja intacta.
En particular, si ese bashshell fue invocado por otro bash
shell (sin embargo zsh, yashy algunas kshimplementaciones también lo hacen), entonces ese bashshell habrá establecido la _variable de entorno en la ruta del comando que se está ejecutando (ese es el tercer punto en su pregunta). Por ejemplo, si bashse invoca para interpretar un script como resultado de otra bashinterpretación de shell:
bash-script some args
Eso bashhabrá pasado _=/path/to/bash-scripen el entorno dado bash-script, y ese es el valor inicial de la $_ bashvariable en el bashshell que interpreta ese script.
$ env -i _=whatever bash -c 'echo "$_"'
whatever
Ahora, si la aplicación que invoca no pasa una _variable de entorno , el bashshell invocado se inicializará $_en el que argv[0]se recibe, que podría ser bash, /path/to/basho
/path/to/some-scripto cualquier otra cosa (en el ejemplo anterior, eso sería /bin/bashsi el she-bang del script era #! /bin/bash
o /path/to/bash-script dependiendo del sistema ).
De modo que el texto es engañoso ya que describe el comportamiento de la persona que llama que bashno tiene control. Es bashmuy posible que la aplicación que se invocó
no se configure $_en absoluto (en la práctica, solo algunos shells y algunas aplicaciones interactivas raras lo hacen, execlp()por ejemplo), o podría usarlo para algo completamente diferente (por ejemplo, ksh93configurarlo *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 no está muy claro tampoco. En la práctica, eso es tan pronto como bashinterpreta un comando simple en el entorno de shell actual.
En el caso de un shell interactivo , eso estará en el primer comando simple interpretado, /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 una _variable de entorno a los comandos que ejecuta que contiene la ruta que se bashutilizó como primer argumento para las execve()llamadas al sistema.
$ env | grep '^_'
_=/usr/bin/env
4. Al revisar el correo
El cuarto punto se describe con más detalles en la descripción de la MAILPATHvariable:
'MAILPATH'
Una lista de nombres de archivos separados por dos puntos que el shell comprueba periódicamente si hay correo nuevo .
Cada entrada de la lista puede especificar el mensaje que se imprime cuando llega un nuevo correo en el archivo de correo separando el nombre del 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>