Bash Manual dice (página de manual, mi énfasis):
Cuando Bash invoca un comando externo, la variable
$_
se establece en la ruta completa del comando y se pasa a ese comando en su entorno.
Y ( Parámetros especiales ):
_
(
$_
, un guión bajo). Al iniciar el shell, establezca el nombre de ruta absoluto utilizado para invocar el shell o el script de shell que se ejecuta como se pasa en el entorno o la lista de argumentos. Posteriormente, se expande hasta el último argumento del comando anterior, después de la expansión. Establezca también el nombre de ruta completo utilizado para invocar cada comando ejecutado y colocado en el entorno exportado a ese comando. Al verificar el correo, este parámetro contiene el nombre del archivo de correo.
En un bash shell, ejecuto:
$ bash $ export | grep '_='
Según el manual,
_
debería ser una variable de entorno del nuevo shell bash.export
se supone que genera todas las variables de entorno del nuevo bash shell, pero no genera_
. Entonces, me pregunto si_
es una variable de entorno del nuevo bash shell.En realidad, en cualquier shell de bash, sucede lo mismo
$ export | grep '_='
no da salida a nada. Entonces, me pregunto si
_
alguna vez es una variable de entorno de un shell bash.Para comparacion:
$ dash $ export | grep '_=' export _='/bin/dash'
Mi publicación está inspirada en el comentario de Mike y la respuesta de Stephane .
export
es incorporado, pero si lo usaprintenv _
, le mostrará cómo se invocó:/usr/bin/printenv
en este sistema.bash -c export | grep _=
(de golpe), se mostrará cómo el shell padre invoca elbash
comando, a pesar de que$_
no está definida en la matriz.Respuestas:
Sí,
_
es una variable de entorno del nuevo shell Bash; puedes ver eso corriendodentro del shell: que muestra el contenido del entorno inicial del shell. No lo verá en el primer shell porque no había un shell anterior para configurarlo antes de que comenzara.
Expandir
$_
dentro de Bash se refiere al_
parámetro especial, que se expande al último argumento del comando anterior. (Internamente, Bash maneja esto mediante el uso de una_
variable de shell, que se actualiza cada vez que se analiza un comando, pero eso es realmente un detalle de implementación. Es "no exportado" cada vez que se analiza un comando ) .export
No se muestra_
porque no es una variable que se marca como exportada; Sin embargo, puede verlo en la salida deset
.En el primer ejemplo, el nuevo shell Bash analiza y ejecuta los comandos en sus archivos de inicio, por lo que, cuando se ejecuta
explore | grep '-='
,_
ya se ha sobrescrito y marcado como no exportado.En el
dash
ejemplo, no parece ejecutar ningún archivo de inicio, por lo que está viendo la variable como una variable de entorno establecida por Bash antes de ejecutarsedash
.fuente
export | grep '_='
muestra nada? En el shell bash original, ¿por qué notr '\0' '\n' < /proc/$$/environ | grep _=
muestra nada?_
se abandona el entorno , y cómo puedo exportarlo al entorno .export
sin argumentos enumera todas las variables exportadas ._
no es una variable, pero aparece como un parámetro especial .Algo confuso,
_
también sería un nombre válido para una variable , a diferencia de los nombres de los otros parámetros especiales. Al menos Bash 4.4 permite tareas, sin quejas. Simplemente no es útil porque el efecto especial anula inmediatamente el valor.fuente
_
embargo, diviértete intentando usarlo como variable ;-). Efectivamente es de solo escritura y el valor se pierde de inmediato._
como una variable, por lo que aparece en la salida deset
. Sin embargo, no se puede marcar como exportado hasta donde puedo determinar.No todas las variables de shell están marcadas como exportadas, como puede ver en la salida de
declare -p
.No tiene ningún sentido
bash
marcar$_
como exportado porque agrega automáticamente esta variable al entorno de los procesos secundarios pero con un valor diferente al que tiene en el shell (en ese momento).Mostrarlo como exportado confundiría al usuario sobre lo que sucederá con el entorno de los comandos externos.
Todas las "variables de tiempo de ejecución"
BASH*
no se exportan.fuente