web-dev-qa-db-fra.com

Que fait "exporter" dans la programmation Shell?

Autant que je sache, l'affectation de variable est la même, qu'elle soit ou non précédée de "export". C'est pour quoi?

109
John Bachir

Variables exportées telles que $HOME et $PATH sont disponibles pour (hérités de) d'autres programmes exécutés par le shell qui les exporte (et les programmes exécutés par ces autres programmes, etc.) en tant que variables d'environnement. Les variables normales (non exportées) ne sont pas disponibles pour les autres programmes.

$ env | grep '^variable='
$                                 # No environment variable called variable
$ variable=Hello                  # Create local (non-exported) variable with value
$ env | grep '^variable='
$                                 # Still no environment variable called variable
$ export variable                 # Mark variable for export to child processes
$ env | grep '^variable='
variable=Hello
$
$ export other_variable=Goodbye   # create and initialize exported variable
$ env | grep '^other_variable='
other_variable=Goodbye
$

Pour plus d'informations, voir l'entrée pour le export intégré dans le GNU Manuel de Bash, ainsi que les sections sur environnement d'exécution de commandes et environnement .

Notez que les variables non exportées seront disponibles pour les sous-shell exécutés via ( ... ) et des notations similaires car ces sous-shell sont des clones directs du shell principal:

$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$

Le sous-shell peut changer sa propre copie d'une variable, exportée ou non, et peut affecter les valeurs vues par les processus qu'il exécute, mais les modifications apportées au sous-shell ne peuvent évidemment pas affecter la variable dans le Shell parent.

Certaines informations sur les sous-shell peuvent être trouvées sous groupement de commandes et environnement d'exécution de commandes dans le manuel de Bash.

126
Jonathan Leffler

cela rend l'affectation visible aux sous-processus.

jcomeau@intrepid:~/rentacoder/bin2txt$ foo=bar
jcomeau@intrepid:~/rentacoder/bin2txt$ bash -c 'echo $foo'

jcomeau@intrepid:~/rentacoder/bin2txt$ export foo
jcomeau@intrepid:~/rentacoder/bin2txt$ bash -c 'echo $foo'
bar
54
jcomeau_ictx

Eh bien, cela dépend généralement de la coquille. Pour bash, il marque la variable comme "exportable", ce qui signifie qu'elle apparaîtra dans l'environnement pour tous les processus enfants que vous exécutez.

Les variables non exportées ne sont visibles que depuis le processus en cours (le shell).

De la page de manuel bash:

export [-fn] [name[=Word]] ...
export -p

Les noms fournis sont marqués pour l'exportation automatique vers l'environnement des commandes exécutées ultérieurement.

Si la -f _ option est donnée, les noms font référence à des fonctions. Si aucun nom n'est donné, ou si le -p l'option est fournie, une liste de tous les noms exportés dans ce shell est imprimée.

Le -n permet de supprimer la propriété d’exportation de chaque nom.

Si un nom de variable est suivi de =Word, la valeur de la variable est définie sur Word.

export renvoie un état de sortie de 0 sauf si une option non valide est rencontrée, si l'un des noms n'est pas un nom de variable Shell valide ou si -f est fourni avec un nom qui n'est pas une fonction.

Vous pouvez également définir des variables comme exportables avec la commande typeset et marquer automatiquement toutes les créations ou modifications de variables futures en tant que telles, avec set -a.

17
paxdiablo