Bash semble faire la différence entre les variables qui ont été exportées et celles qui ne l'ont pas été.
exemple :
$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR
set
voit la variable mais env
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
est un bash intégré et env
n'est pas.
Quelles sont les différences entre les variables qui sont exportées et celles qui ne le sont pas ?
Réponse acceptée :
Les variables exportées sont transporté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'invocation actuelle du shell. Depuis l'export
page de manuel :
Le shell donnera l'attribut export aux variables correspondant aux noms spécifiés, ce qui les placera dans l'environnement des commandes exécutées ultérieurement.
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 arguments affichera ce que serait ce nouvel environnement. Depuis env
crée un nouvel environnement, seules les variables exportées sont transférées, comme c'est le cas pour tout programme lancé à partir de ce shell. Par exemple, générer un deuxième shell dans le premier (j'ai utilisé $$
pour représenter les invites dans le shell interne) :
$ FOO=BAR
$ bash
$$ echo $FOO # Note the empty line
$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$
Notez que c'est la variable qui est exportée, pas seulement sa valeur. Cela signifie qu'une fois que vous avez export FOO
, FOO
devient une variable globale et apparaît dans les environnements suivants, même s'il est modifié ultérieurement :
$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$