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 $var
no dará nada. Si ejecuto el set -a
, entonces set
no 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.$1
configura comovar=99
).$_
se establece en el último parámetro (expandido).conjunto -a
La ejecución de
set -a
marca todas las variables posteriores (nuevas o modificadas) como exportadas (en todos los shells, excepto encsh
algunos shells relacionados).Para recuperarse de esta configuración, simplemente cambie
-
a+
:establecer var = 99
Lo que debería ser
set -- var=99
para 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 preparandovar
a99
). 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
-a
opciónset
hará 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 comandodash
solo 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
var
y 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=99
que no establece la variable de entornovar
en99
; se pone$1
avar=99
. Pruebaecho "$1"
oecho "$*"
y verás.fuente