Après avoir exécuté le set -a var=99
, je peux trouver une phrase dans la sortie de set
:
...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...
Quelqu'un pourrait-il me dire ce que "_ =" signifie?
Je note que cela echo $var
ne donnera rien. Si je lance le set -a
, alors le set
ne comprendra plus cette variable. Qu'est-ce qui se passe?
Réponses:
Lorsque vous exécutez
set -a var=99
, trois choses distinctes se produisent (liées à votre question):-a
) (inverser en faisantset +a
) pour exporter les variables.$1
définis survar=99
).$_
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 decsh
certains shells associés).Pour récupérer à partir de ce paramètre, changez simplement le
-
en a+
: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)._ = 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.Veuillez noter que la valeur en
$_
est la valeur après expansion:C'est pourquoi lorsque vous exécutez:
Vous obtenez une description de la variable shell '$ _'. Cela fonctionne également:
la source
Le trait de soulignement est en fait une variable shell spéciale. Ce que vous voyez ici est la
_
variable underscore ( ) avec une valeur devar=99
. Il est en lecture seule et maintenu par le shell. C'est:Votre exemple tombe dans la deuxième catégorie. Vous avez tapé:
Donc, le dernier argument était
var=99
, et c'était la valeur que vous définissiez (vous n'étiez pas réglévar
sur99
). Par conséquent, a_
été fixé à cela. Et c'est ce qui est rapporté:C'est un peu déroutant, mais le premier
=
indique l'affectation à la variable_
et le second fait partie de la valeur.Il convient également de mentionner que l'
-a
option toset
entraînera l' exportation de toutes les variables définies ultérieurement .la source
La bonne réponse dépend du shell que vous utilisez:
bash
, tout ce que @BobEager a dit s'appliquezsh
, il est uniquement défini sur le dernier argument de la commande précédente et sur le chemin d'accès complet de la commande dans l'environnement de la commandedash
uniquement définir cette variable lors de l'exécution d'une session interactiveIl peut également y avoir d'autres particularités dans d'autres coquilles. En tant que tel,
$_
n'est pas défini dans POSIX, il faut donc être conscient des problèmes potentiels de portabilité lors de son utilisation.Note latérale: si votre intention est d'attribuer la valeur de 99 à
var
et de la rendre disponible dans l'environnement des sous-processus suivants, la syntaxe correcte pour y parvenir est:la source
unset var;set -a; var=99
. Fonctionne dans tous les shells résonnables (pas csh et al).Dans l'impression pas si fine de bash (1) , on trouve
Ce qui signifie,
set -a var=99
ne définit pas la variable d'environnementvar
sur99
; il se met$1
àvar=99
. Essayezecho "$1"
ouecho "$*"
et vous verrez.la source