[gull] Partager une variable entre deux scripts shell

Leopoldo Ghielmetti leopoldo.ghielmetti at a3.epfl.ch
Wed Nov 8 15:54:14 CET 2006


salut,

Sous bash il y a trois solutions que je connais, la première consiste à
exécuter le deuxième script dans le même environnement du premier en
écrivant:
##### SCRIPT 1
#!/bin/sh
echo "begin script 1"
. ./script2.sh
echo "VAR BAR: $BAR"
echo "end script 1"

##### SCRIPT 2
#!/bin/sh
echo "begin script 2"
BAR="foo"
echo "VAR BAR: $BAR"
export $BAR
echo "end script 2"

L'avantage c'est que c'est très simple à implémenter.
L'inconvénient c'est que toutes les variables de script2.sh seront
visibles dans script1.sh et que toutes les modifications apportées par
script2.sh seront aussi visibles dans script1.sh. En pratique il s'agit
d'un include à la C.

La deuxième solution c'est de se faire renvoyer ces informations par le
script2.sh sur le stdout (ou autre fichier) et d'intégrer ces variables
dans script1.sh.
L'avantage c'est que seul les variables qu'on désire transitent tandis
que les autres restent locales. Inconvénient, le script2.sh doit être
fait exprès pour ça, donc c'est exclus d'avoir un script générique.

Si tu utilises la stdout:
##### SCRIPT 1
#!/bin/sh
echo "begin script 1"
eval "$(./script2.sh)"
echo "VAR BAR: $BAR"
echo "end script 1"

##### SCRIPT 2
#!/bin/sh
echo "begin script 2" >&2
BAR="foo" >&2
echo "VAR BAR: $BAR" >&2
echo "end script 2" >&2
echo "export BAR=\"$BAR\""

En plus il a le désavantage que le script2.sh va communiquer uniquement
avec le stderr tandis que le stdout est utilisé pour transmettre les
variables.

Une variante c'est d'utiliser d'autres déscripteurs de fichiers pour
transmettre les variables d'environnement tout en laissant les stdout et
stderr fonctionner comme d'habitude:
##### SCRIPT 1
#!/bin/sh
echo "begin script 1"
( eval "$(./script2.sh 3>&1 1>&4)" ) > 4>&1
echo "VAR BAR: $BAR"
echo "end script 1"

##### SCRIPT 2
#!/bin/sh
echo "begin script 2"
BAR="foo"
echo "VAR BAR: $BAR"
export $BAR
echo "end script 2"
echo "export BAR=\"$BAR\"" >&3

Qui a le désavantage que le script2.sh ne marchera pas en dehors du
contexte du script1.sh, en effet si on l'exécute tout seul on aura:
./script2.sh: line 7: 3: Bad file descriptor

La raison d'utiliser le fd3 et fd4? Simple, de cette façon les stderr et
stdout du script2.sh fonctionneront exactement de façon standard tandis
que le fd3 sera utilisé pour la transmission des variables
d'environnement.

A toi de voir laquelle te convient le mieux.

ciao, Leo

On Wed, 2006-11-08 at 15:13 +0100, Nicolas Borboën wrote:
> Bonjour à tous,
> J'ai deux scripts shell, l'un appel l'autre. J'aimerais récupérer une
> variable de l'autre dans le premier, c'est possible?
> 
> Ci-dessous mes script de test (aussi dispo ici:
> http://paste.ubuntu-nl.org/30623/)
> 
> ##### SCRIPT 1
> #!/bin/sh
> echo "begin script 1"
> ./script2.sh
> echo "VAR BAR: $BAR"
> echo "end script 1"
> 
> 
> ##### SCRIPT 2
> #!/bin/sh
> echo "begin script 2"
> BAR="foo"
> echo "VAR BAR: $BAR"
> export $BAR
> echo "end script 2"
> 
> 
> PS: m'excuse d'avance au cas ou cela coulerait de source pour certains :-p
> _______________________________________________
> gull mailing list
> gull at lists.alphanet.ch
> http://lists.alphanet.ch/mailman/listinfo/gull




More information about the gull mailing list