[gull] Partager une variable entre deux scripts shell

Nicolas Borboën nbo at donax.ch
Wed Nov 8 16:21:13 CET 2006


Leopoldo Ghielmetti wrote:
> 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
Merci c'est très instructif. A priori la première sera suffisante pour
mon utilisation, mais je retiens la deuxième en cas de besoin!

++
Nicolas



More information about the gull mailing list