web-dev-qa-db-fra.com

Différence entre les variables de coquilles exportées et ceux qui ne sont pas en bash

Bash semble différencier des variables exportées et celles qui ne l'ont pas.

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 est un bâtiment intégré et env n'est pas.

Quelles sont les différences entre les variables exportées et celles qui ne sont pas?

46
lesmana

Les variables exportées sont effectuées dans l'environnement des commandes exécutées par la coquille qui les exercent, tandis que des variables non exportées sont locales à l'invocation de Shell actuelle. À partir de la page export manuel:

La coquille doit donner l'attribut d'exportation aux variables correspondant aux noms spécifiés, qui les obligera à être dans l'environnement des commandes exécutées par la suite.

set tire 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 argument ne produira que ce nouvel environnement serait. Étant donné que env crée un nouvel environnement, seules les variables exportées sont traduites, comme c'est le cas pour tout programme lancé à partir de ce shell. Par exemple, frayer une deuxième coquille dans la première (j'ai utilisé $$ Pour représenter des invites dans la coque intérieure):

$ FOO=BAR
$ bash
$$ echo $FOO             # Note the empty line

$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$

Notez que c'est la variable 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 ultérieurs, même si cela est changé plus tard:

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$
45
Michael Mrozek