Différence entre la variable d'environnement et la variable shell

8

On dit que les variables d'environnement sont héritées dans les processus enfants mais pas les variables shell. Cependant, le test suivant montre que les variables shell sont vues dans le processus enfant comme des variables d'environnement. Quelle est la différence?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST
ning
la source

Réponses:

9

Votre deuxième affectation TEST="SHELL_TEST"ne désexporte pas la variable. Il est toujours marqué comme «hérité des enfants». Et la valeur héritée par l'enfant est la valeur actuellement définie dans le parent.
En d'autres termes, votre deuxième affectation ne ramène pas le statut de TESTà une variable shell, c'est toujours une variable d'environnement selon cette terminologie.

Vous devez le désexporter pour qu'il ne soit pas défini dans les processus enfants:

$ typeset +x TEST
$ sh -c 'echo $TEST'

$
Tapis
la source
Salut Mat, merci pour ta réponse. Donc ma compréhension (il y a deux variables nommées TEST, une pour la variable d'environnement et une pour la variable shell, shell var TEST shadows env var TEST.) Est incorrecte, il n'y a qu'une seule variable dans Bash, c'est toujours une variable shell et peut être défini pour être exporté et agit comme une variable d'environnement. Est-ce spécifique à Bash et dépendant de l'implémentation, ou il est universel dans tous les shells. Je vous remercie.
ning
Je ne suis pas sûr de «universel», mais cela fonctionne au moins avec bash, ksh et zsh.
Mat
2
@ning C'est ainsi que fonctionnent tous les shells modernes de style POSIX / Bourne (ash, ksh, bash, zsh). Il y avait des versions anciennes du shell Bourne où le changement d'une variable de shell exportée ne changeait pas la valeur dans l'environnement, mais il est peu probable que vous les rencontriez plus. Csh fonctionne différemment, vous pouvez toujours rencontrer cela dans des environnements à l'ancienne, mais cela aussi est obsolète depuis un certain temps.
Gilles 'SO- arrête d'être méchant'
@Gilles Merci d'avoir précisé ce qui se passe et pourquoi. Comme quelqu'un l'a dit, chaque développeur Unix devrait également être un historien.
ning