Bash Manual dit (page de manuel, je souligne):
Lorsque Bash appelle une commande externe, la variable
$_
est définie sur le chemin d'accès complet de la commande et transmise à cette commande dans son environnement.
Et ( paramètres spéciaux ):
_
(
$_
, un trait de soulignement.) Au démarrage du shell, définissez le chemin d'accès absolu utilisé pour appeler le shell ou le script de shell en cours d'exécution tel que transmis dans l'environnement ou la liste d'arguments. Par la suite, se développe jusqu'au dernier argument de la commande précédente, après expansion. Définissez également le chemin d'accès complet utilisé pour appeler chaque commande exécutée et placée dans l'environnement exporté vers cette commande. Lors de la vérification du courrier, ce paramètre contient le nom du fichier courrier.
Dans un shell bash, je lance:
$ bash $ export | grep '_='
Selon le manuel,
_
devrait être une variable d'environnement du nouveau shell bash.export
est censé sortir toutes les variables d'environnement du nouveau shell bash, mais il ne sort pas_
. Je me demande donc si_
est une variable d'environnement du nouveau shell bash?En fait, dans n'importe quel shell bash, la même chose se produit
$ export | grep '_='
ne produit rien. Je me demande donc s'il
_
existe jamais une variable d'environnement d'un shell bash?En comparaison:
$ dash $ export | grep '_=' export _='/bin/dash'
Mon message est inspiré du commentaire de Mike et de la réponse de Stéphane .
export
est une fonction intégrée, mais si vous l'utilisezprintenv _
, elle vous montrera comment elle a été invoquée:/usr/bin/printenv
sur ce système.bash -c export | grep _=
(Bash), va montrer comment le shell parent a invoqué labash
commande, même si$_
est dans le parent unset.Réponses:
Oui,
_
est une variable d'environnement du nouveau shell Bash; vous pouvez le voir en exécutantà l'intérieur du shell: qui montre le contenu de l'environnement initial du shell. Vous ne le verrez pas dans le premier shell car il n'y avait pas de shell précédent pour le définir avant de commencer.
Le développement à l'
$_
intérieur de Bash fait référence au_
paramètre spécial, qui se développe jusqu'au dernier argument de la commande précédente. (En interne, Bash gère cela en utilisant une_
variable shell, qui est mise à jour chaque fois qu'une commande est analysée, mais c'est vraiment un détail d'implémentation. Elle est "non exportée" chaque fois qu'une commande est analysée. )export
Ne s'affiche pas_
parce qu'elle n'est pas une variable qui est marquée comme exportée; vous pouvez cependant le voir dans la sortie deset
.Dans le premier exemple, le nouveau shell Bash analyse et exécute les commandes dans ses fichiers de démarrage, donc lors de son exécution
explore | grep '-='
, il_
a déjà été remplacé et marqué comme non exporté.Dans l'
dash
exemple, il ne semble pas exécuter de fichier de démarrage, vous voyez donc la variable comme une variable d'environnement qui a été définie par Bash avant de s'exécuterdash
.la source
export | grep '_='
produit-il rien? Dans le shell bash d'origine, pourquoi netr '\0' '\n' < /proc/$$/environ | grep _=
produit-il rien?_
est abandonné de l'environnement , et comment puis- je le réexporter dans l'environnement ?export
sans arguments répertorie toutes les variables exportées ._
n'est pas une variable, mais est répertorié comme paramètre spécial .Un peu confus,
_
serait également un nom valide pour une variable , contrairement aux noms des autres paramètres spéciaux. Au moins Bash 4.4 permet des affectations, sans plaintes. Ce n'est tout simplement pas utile car l'effet spécial remplace immédiatement la valeur.la source
_
comme variable ;-). Il est effectivement en écriture seule et la valeur est immédiatement perdue._
comme une variable, c'est pourquoi il apparaît dans la sortie deset
. Cependant, il ne peut pas être marqué comme exporté pour autant que je puisse le déterminer.Toutes les variables shell ne sont pas marquées comme exportées comme vous pouvez le voir dans la sortie de
declare -p
.Cela n'a aucun sens
bash
de marquer$_
comme exporté car il ajoute automatiquement cette variable à l'environnement des processus enfants mais avec une valeur différente de celle qu'il a dans le shell (à ce moment).L'afficher comme exporté ne ferait que dérouter l'utilisateur sur ce qui va se passer avec l'environnement des commandes externes.
Toutes les "variables d'exécution"
BASH*
ne sont pas exportées.la source