Estoy de acuerdo, no está muy claro.
1. Al iniciar el shell,
si la _
variable estaba en el entorno que la bash
recibió , la bash
deja intacta.
En particular, si ese bash
shell fue invocado por otro bash
shell (sin embargo zsh
, yash
y algunas ksh
implementaciones también lo hacen), entonces ese bash
shell 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 bash
se invoca para interpretar un script como resultado de otra bash
interpretación de shell:
bash-script some args
Eso bash
habrá pasado _=/path/to/bash-scrip
en el entorno dado bash-script
, y ese es el valor inicial de la $_
bash
variable en el bash
shell 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 bash
shell invocado se inicializará $_
en el que argv[0]
se recibe, que podría ser bash
, /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 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 bash
no tiene control. Es bash
muy 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, ksh93
configurarlo *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 bash
interpreta 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.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 una _
variable de entorno a los comandos que ejecuta que contiene la ruta que se bash
utilizó 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 MAILPATH
variable:
'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>