Después de ejecutar el set -a var=99, puedo encontrar una oración en la salida de set:
...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...
¿Alguien podría decirme qué significa "_ ="?
Noto que echo $varno dará nada. Si ejecuto el set -a, entonces setno incluirá esta variable nuevamente. ¿Que esta pasando?

Respuestas:
Cuando ejecuta
set -a var=99, suceden tres cosas distintas (relacionadas con su pregunta):-a) (revertir haciendoset +a) para exportar vars.$1configura comovar=99).$_se establece en el último parámetro (expandido).conjunto -a
La ejecución de
set -amarca todas las variables posteriores (nuevas o modificadas) como exportadas (en todos los shells, excepto encshalgunos shells relacionados).Para recuperarse de esta configuración, simplemente cambie
-a+:establecer var = 99
Lo que debería ser
set -- var=99para evitar la interpretación de una opción (y el conjunto tiene mucho) con valores que comienzan con un guión (-).Establece la lista de argumentos (la lista de parámetros posicionales) a eso después de
--. Eso es válido en todos los shells razonables (no en csh et al). Los argumentos posicionales se imprimen con "$ @" (o similar "$ *", no igual)._ = último_argumento
Y, el valor de la variable de shell interna
_cambia al último argumento de la línea ejecutada. Eso NO es cierto en casi todos los shells (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh y, por supuesto, csh y tcsh) excepto bash.Tenga en cuenta que el valor en
$_es el valor después de la expansión:Es por eso que cuando ejecutas:
Obtiene una descripción de la variable de shell '$ _'. Esto también funciona:
fuente
El guión bajo es en realidad una variable de shell especial. Lo que está viendo aquí es la
_variable de subrayado ( ) con un valor devar=99. Es de solo lectura y lo mantiene el shell. Es:Su ejemplo cae en la segunda categoría. Escribiste:
Por lo que el último argumento no había
var=99, y que fue el valor que fueron escenario (no se estaban preparandovara99). Por lo tanto,_se estableció en eso. Y eso es lo que se informa:Es un poco confuso, pero el primero
=indica la asignación a la variable_y el segundo es parte del valor.También vale la pena mencionar que la
-aopciónsethará que todas las variables definidas posteriormente se exporten.fuente
La respuesta correcta dependerá del shell que esté usando:
bash, lo que sea que @BobEager dijo se aplicazsh, solo se establece en el último argumento del comando anterior y en la ruta completa del comando en el entorno del comandodashsolo establecen esta variable cuando se ejecuta una sesión interactivaPuede haber otras particularidades en otros depósitos también. Como tal, no
$_está definido en POSIX, por lo que uno debe tener en cuenta los posibles problemas de portabilidad al usarlo.Nota al margen: si su intención es asignar el valor de 99
vary ponerlo a disposición en el entorno de los subprocesos posteriores, la sintaxis correcta para lograr esto es:fuente
unset var;set -a; var=99. Funciona en todos los shells razonables (no csh et al).En la letra no tan pequeña de bash (1) , encontramos
Lo que significa
set -a var=99que no establece la variable de entornovaren99; se pone$1avar=99. Pruebaecho "$1"oecho "$*"y verás.fuente