Cuando ejecuta set -a var=99
, suceden tres cosas distintas (relacionadas con su pregunta):
- Una opción establecida (
-a
) (revertir haciendo set +a
) para exportar vars.
- Los parámetros posicionales se "configuran" según lo que sigue a las opciones (se
$1
configura como var=99
).
- El guión bajo de la variable de shell
$_
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 en csh
algunos shells relacionados).
$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer
Para recuperarse de esta configuración, simplemente cambie -
a +
:
$ set +a
$ unset myvariable # to erase it from the environment if it
# was exported before the change of set +a
$ myvariable=456544654 # A new value of the variable.
$ env | grep "variable" # No output means the var does not exist
# in the current environment
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).
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
_ = ú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.
$ echo one two last argument
one two last argument
$ echo "$_"
argument
$ echo This is a new: last_argument
This is a new: last_argument
$ echo "$_"
last_argument
Tenga en cuenta que el valor en $_
es el valor después de la expansión:
$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument
$ echo "$_"
A New_Argument
Es por eso que cuando ejecutas:
$ set -a myvar=99; set | grep 'myvar'
_=myvar=99
Obtiene una descripción de la variable de shell '$ _'. Esto también funciona:
$ set -a myvar=99; declare -p _
declare -- _="myvar=99"