Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/07/2009, à 14:59

MrAzerty

A quoi sert la commande export? [Résolu]

Bonjour,

à quoi sert la commande export s'il vous plait?
Bon je sais que ça alloue une valeur à une variable, exemple:

export MA_VARIABLE="ma valeur"

Mais y a-t-il une différence par rapport à la commande suivante?

MA_VARIABLE="ma valeur"

Merci pour vos réponses.

Dernière modification par MrAzerty (Le 20/10/2009, à 07:19)


On est toujours le geek de quelqu'un.

Hors ligne

#2 Le 28/07/2009, à 15:52

gigiair

Re : A quoi sert la commande export? [Résolu]

C'est une question de portée de la variable.
la portée de 

MA_VARIABLE="ma valeur"

est l'environnement dans lequel MA_VARIABLE a été déclaré, et lui seulement (pas les environnements créés dans cet environnement).
A contrario, si tu déclare

export MA_VARIABLE="ma valeur"

MA_VARIABLE sera vu de tous les environnements créés dans l'environnement de la création de MA_VARIABLE.
Si je lance

 MA_VARIABLE="ma valeur"; emacs

l'évaluation de  (getenv "MA_VARIABLE") retourne ma valeur, mais si j'ouvre un shell sous Emacs echo ${MA_VARIABLE} ne renvoie rien.
Si je veux que soit renvoyé "ma valeur", je dois lancer le processus par

 MA_VARIABLE="ma valeur";export MA_VARIABLE; emacs

J'ai pris un exemple avec ce que je pratique le plus, c'est la première chose qui me soit venue à l'idée, mais tu dois pouvoir te créer un exemple avec n'importe quel applicatif qui donne l'accès aux variables d'environnement, bash par exemple, et qui sera peut-être plus parlant pour toi.

Dernière modification par gigiair (Le 28/07/2009, à 15:56)


--
JJR.

Hors ligne

#3 Le 28/07/2009, à 17:41

MrAzerty

Re : A quoi sert la commande export? [Résolu]

Ok merci beaucoup pour ta réponse.
Ce que je ne comprends toujours pas c'est que même sans utiliser export, ma variable "survit" dans un script. Exemple en bash:

~/mon_tmp$ cat script.sh
#!/bin/bash
echo $MA_VARIABLE

~/mon_tmp$ MA_VARIABLE=plop
~/mon_tmp$ ./script.sh
plop

Pourtant, l'environnement de mon script est bien un "fils" de l'environnement ou a été initialisée "MA_VARIABLE" sans export?


On est toujours le geek de quelqu'un.

Hors ligne

#4 Le 28/07/2009, à 18:55

gigiair

Re : A quoi sert la commande export? [Résolu]

Sans doute que dans ce cas, script.sh s'exécute dans l'environnement du shell. Je ne suis pas assez compétent pour répondre. Si on veut utiliser ces mécanismes, il vaut mieux trouver une bonne documentation, et faire  des tests avant.


--
JJR.

Hors ligne

#5 Le 28/07/2009, à 20:02

Link31

Re : A quoi sert la commande export? [Résolu]

Chez moi ça marche :

link31@linux /tmp $ echo $MA_VARIABLE

link31@linux /tmp $ cat script.sh
#!/bin/bash
echo $MA_VARIABLE
link31@linux /tmp $ MA_VARIABLE=plop
link31@linux /tmp $ ./script.sh 

link31@linux /tmp $ export MA_VARIABLE=plop
link31@linux /tmp $ ./script.sh 
plop
link31@linux /tmp $

Hors ligne

#6 Le 28/07/2009, à 21:34

MrAzerty

Re : A quoi sert la commande export? [Résolu]

Ok Link31, mais en fait je pensais que sans faire d'export, mon script ne connaitrais pas la variable. Il la connait donc je suppose que dans le script, je suis toujours dans le même environnement.

J'ai aussi fait un test tout bête:

~$ MA_VARIABLE="une valeur"
~$ bash #Appel d'un autre shell
~$ echo $MA_VARIABLE #Pas de valeur

~$ exit #Retour dans le premier shell
~$ export MA_VARIABLE
~$ bash
~$ echo $MA_VARIABLE
une valeur

Donc j'ai ma réponse:
export sert bien à donner comme portée aux variables les environnements créés par l'environnement de la variable. Avec une simple affectation, la variable n'existe plus. Mon erreur, c'est que je croyais qu'un script appelé était un "sous-environnement", mais apparemment non.

Merci à vous!

Dernière modification par MrAzerty (Le 28/07/2009, à 21:35)


On est toujours le geek de quelqu'un.

Hors ligne

#7 Le 28/07/2009, à 22:50

Link31

Re : A quoi sert la commande export? [Résolu]

MrAzerty a écrit :

Mon erreur, c'est que je croyais qu'un script appelé était un "sous-environnement", mais apparemment non.

C'est pourtant le cas. Dans ton premier test, tu avais probablement exporté ta variable précédemment sans t'en souvenir.

Hors ligne

#8 Le 29/07/2009, à 07:49

MrAzerty

Re : A quoi sert la commande export? [Résolu]

C'est fort possible, je refais des tests et je vous tient au courant.


On est toujours le geek de quelqu'un.

Hors ligne

#9 Le 29/07/2009, à 08:46

alexduf

Re : A quoi sert la commande export? [Résolu]

Quand vous parlez de sous-environnement, en fait c'est des processus fils ?

Hors ligne

#10 Le 29/07/2009, à 09:18

MrAzerty

Re : A quoi sert la commande export? [Résolu]

Oui, des processus fils qui héritent des variables d'environnement.


On est toujours le geek de quelqu'un.

Hors ligne

#11 Le 19/10/2009, à 14:14

MrAzerty

Re : A quoi sert la commande export? [Résolu]

J'ai une autre question: la commande export sert-elle à quelque-chose si on source le fichier (
Dans les exemples précédents, les fichiers étaient exécutés, pas "sourcés")?
Si je créé deux fichiers, l'un avec VARIABLE=VALEUR, l'autre avec export VARIABLE=VALEUR, j'ai l'impression que le résultat est le même, que l'on utilise export ou pas. Exemple:

moi@serveur:~ $ echo MAVAR="plop" > tmp1
moi@serveur:~ $ echo export MAVAR="plop" > tmp2
moi@serveur:~ $ chmod +x tmp1 tmp2
moi@serveur:~ $ tmp1
moi@serveur:~ $ echo $MAVAR

moi@serveur:~ $ . tmp1
moi@serveur:~ $  echo $MAVAR
plop
moi@serveur:~ $ MAVAR=""
moi@serveur:~ $ tmp2
moi@serveur:~ $ echo $MAVAR

moi@serveur:~ $ . tmp2
moi@serveur:~ $ echo $MAVAR
plop

Bref, dans le cas ou on source un fichier, le comportement est-il bien le même, que l'on utilise export ou pas?

Dernière modification par MrAzerty (Le 19/10/2009, à 14:16)


On est toujours le geek de quelqu'un.

Hors ligne

#12 Le 19/10/2009, à 16:42

eiger

Re : A quoi sert la commande export? [Résolu]

Avant de tenter de répondre à ta question, quelques rappels (désolé si c'est connu et maitrisé, mais en lisant tes questions, je n'en étais pas sûr) :

1. lorsque tu exécutes un script shell par un appel du style "./script.sh", ton shell se contentera d'interpréter le shebang (#!/bin/bash) et démarrera un processus fils qui sera chargé d'exécuter la suite de ton script. Le processus fils hérite des variables d'environnement du père qui ont été "exportées". Lorsque ton script se termine, le processus fils "meurt" naturellement et tu te retrouves dans ton shell "père" de départ. Les définitions ou modification de variables dans le processus fils n'ont aucune influence sur le père.

2. Lorsque tu "sources" un script shell, il n'y a pas de processus fils. Ton shell "sans enfants" interprète directement le script. Si ton script définit ou modifie des variables, c'est ton shell courant qui est affecté.

Dans tes 2 exemples, tu fais donc des choses différentes:
- exemple 1: tu crées des processus qui héritent (ou non) des variables du père
- exemple 2: tu définis ou modifie directement les variables du "père sans enfants"

Maintenant pour en venir à ta question, si on s'en tient strictement à ton exemple n°2, il n'y a en effet pas de différence avec ou sans "export", puisqu'il n'y a pas eu de création de processus fils et donc pas besoin d'héritage de variables. En revanche si tu lances des processus fils après avoir "sourcé" ton script, la différence sera visible.

Avant de vouloir utiliser "export" dans des scripts, la vraie question que tu dois te poser c'est : "est-ce qu'un processus fils aura besoin de cette variable ?". Si oui, on exporte, sinon on garde tout ça local. A vouloir trop exporter, on risque ce qu'on appelle en anglais le "namespace pollution", c'est à dire qu'on se retrouve parfois avec des scripts d'origines diverses qui utilisent les même noms de variables et rentrent en conflit.

Hors ligne

#13 Le 20/10/2009, à 07:18

MrAzerty

Re : A quoi sert la commande export? [Résolu]

Merci pour cette réponse très claire, eiger!


On est toujours le geek de quelqu'un.

Hors ligne