Lorsque vous exécutez set -a var=99
, trois choses distinctes se produisent (liées à votre question):
- Une option définie (
-a
) (inverser en faisant set +a
) pour exporter les variables.
- Les paramètres de position sont "définis" sur ce qui suit les options (
$1
définis sur var=99
).
- Le trait de soulignement de la variable shell
$_
est défini sur le dernier paramètre (développé).
set -a
L'exécution de set -a
marque toutes les variables suivantes (nouvelles ou modifiées) comme exportées (dans tous les shells, à l'exception de csh
certains shells associés).
$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer
Pour récupérer à partir de ce paramètre, changez simplement le -
en 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
définir var = 99
Ce qui devrait en fait être set -- var=99
d'éviter l'interprétation d'une option (et set a beaucoup) avec des valeurs qui commencent par un tiret ( -
).
Définit la liste des arguments (la liste des paramètres de position) sur celle après le --
. Cela est valable dans tous les shells raisonnables (pas dans csh et al). Les arguments positionnels sont imprimés avec "$ @" (ou similaire "$ *", différent).
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
_ = dernier_argument
Et, la valeur de la variable shell interne devient _
le dernier argument de la ligne exécutée. Ce n'est PAS vrai dans presque tous les shells (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh et bien sûr csh et tcsh) sauf 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
Veuillez noter que la valeur en $_
est la valeur après expansion:
$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument
$ echo "$_"
A New_Argument
C'est pourquoi lorsque vous exécutez:
$ set -a myvar=99; set | grep 'myvar'
_=myvar=99
Vous obtenez une description de la variable shell '$ _'. Cela fonctionne également:
$ set -a myvar=99; declare -p _
declare -- _="myvar=99"