Bash semble faire la différence entre les variables exportées et les autres.
Exemple:
$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR
set
voit la variable mais env
ne le fait pas.
$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR
set
voit les deux variables mais env
ne voit que la variable exportée.
Je sais que set
c'est une bash intégré et env
n'est pas.
Quelles sont les différences entre les variables exportées et celles qui ne le sont pas?
shell
environment-variables
lesmana
la source
la source
Réponses:
Les variables exportées sont transférées dans l'environnement des commandes exécutées par le shell qui les a exportées, tandis que les variables non exportées sont locales à l'appel du shell en cours. De la
export
page de manuel:set
génère l'environnement actuel, qui inclut toutes les variables locales non exportées.env
est utilisé pour lancer des programmes dans un nouvel environnement et, sans aucun argument, affichera ce que serait ce nouvel environnement. Comme ilenv
crée un nouvel environnement, seules les variables exportées sont importées, comme c'est le cas pour tout programme lancé à partir de ce shell. Par exemple, la création d'un deuxième shell dans le premier (je$$
représentais autrefois les invites dans la coque interne):Notez que c'est la variable qui est exportée, pas seulement sa valeur. Cela signifie qu'une fois que vous
export FOO
,FOO
devient une variable globale et apparaît dans des environnements suivants, même si plus tard changé:la source
locale
le shell actuel n’afficherait-il pas les mises à jour?