Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

recuperer une variable du shell

12 réponses
Avatar
octane
Bonjour,

j'ai un job qui lance un script sheel, qui value des variables et qui
lance un script perl.

Depuis le script perl, j'ai besoin d'une variable d'environnement du
script shell (qui est exportee).

j'ai lance un simple:
$jobid=`/bin/echo $JOBID`
mais ma variable $jobid est vide..

qu'est ce que je rate?

Merci

10 réponses

1 2
Avatar
Klaus
wrote:
Bonjour,

j'ai un job qui lance un script sheel, qui value des variables et qui
lance un script perl.

Depuis le script perl, j'ai besoin d'une variable d'environnement du
script shell (qui est exportee).

j'ai lance un simple:
$jobid=`/bin/echo $JOBID`
mais ma variable $jobid est vide..

qu'est ce que je rate?



Je ne connais pas les scripts shell, mais je donne un exemple
entièrement écrit en perl:

premier.pl
========================= =======
use strict;
use warnings;

print "Demarrage du premier programme.n";

$ENV{JOBID} = '12345';

print "Au debut: JOBID = '$ENV{JOBID}'.n";
print "Maintenant j'appelle le second programme.n";

system('perl second.pl');

print "Maintenant dans premier: JOBID = '$ENV{JOBID}'.n";
========================= =======

second.pl
========================= =======
use strict;
use warnings;

print "nAu debut du second programme: JOBID = '$ENV{JOBID}'.n";
print "Mais je change JOBID.n";

$ENV{JOBID} = '67890';

print "Maintenant: JOBID = '$ENV{JOBID}'.n";
print "Fin du second programme.nn";
========================= =======

voici le résultat quand je lance "perl premier.pl":
========================= =======
Demarrage du premier programme.
Au debut: JOBID = '12345'.
Maintenant j'appelle le second programme.

Au debut du second programme: JOBID = '12345'.
Mais je change JOBID.
Maintenant: JOBID = '67890'.
Fin du second programme.

Maintenant dans premier: JOBID = '12345'.
========================= =======

Avatar
Denis
Bonjour,

Depuis le script perl, j'ai besoin d'une variable d'environnement


En perl, les variables d'environnement sont accessibles dans le tableau
associatif %env (par exemple JOBID est accessible par $env{'JOBID'})

Bonne continuation,

--
Denis

Avatar
Benoit Izac
Bonjour,

le 11/09/2006 à 12:19, a écrit dans le message
:

j'ai un job qui lance un script sheel, qui value des variables et qui
lance un script perl.


C'est pas très clair ...

Depuis le script perl, j'ai besoin d'une variable d'environnement du
script shell (qui est exportee).

j'ai lance un simple:
$jobid=`/bin/echo $JOBID`
mais ma variable $jobid est vide..

qu'est ce que je rate?


Les variables d'environnement sont disponibles dans %ENV.
Il me semble que tu cherches $ENV{jobid} :

#!/bin/sh
jobid="foobar"
export jobid
perl -e 'print "$ENV{jobid}n"'

--
Benoit Izac

Avatar
Denis
En perl, les variables d'environnement sont accessibles dans le tableau
associatif %env (par exemple JOBID est accessible par $env{'JOBID'})


C'est %ENV, pas %env. Au passage, lorsque tu récupères des variables
d'environnement, il faut que tu penses que ton script peut tourner un
jour en mode "taint", pense-donc à toujours contrôler tes variables
(dans ton cas, un =~ /^[0-9]+$/ serait correct).

--
Denis

Avatar
octane
j'ai un job qui lance un script sheel, qui value des variables et qui
lance un script perl.


C'est pas très clair ...

tout ca pour dire que le numero de job est genere a la volee par le

script shell. Donc je ne peux pas ecrire en dur cette variable

Depuis le script perl, j'ai besoin d'une variable d'environnement du
script shell (qui est exportee).

j'ai lance un simple:
$jobid=`/bin/echo $JOBID`
mais ma variable $jobid est vide..

qu'est ce que je rate?


Les variables d'environnement sont disponibles dans %ENV.
Il me semble que tu cherches $ENV{jobid} :

#!/bin/sh
jobid="foobar"
export jobid
perl -e 'print "$ENV{jobid}n"'

ah oui. nickel.

$jobid = $ENV{'JOBID'};

Mais pourquoi l'expression avec le /bin/echo ne fonctionne pas?
si je fais un /bin/date, ca fonctionne.
(note: je ne connais pas du tout le perl)


Avatar
Denis
j'ai lance un simple:
$jobid=`/bin/echo $JOBID`
mais ma variable $jobid est vide..



Mais pourquoi l'expression avec le /bin/echo ne fonctionne pas?


Lorsque tu utilises les apostrophes inverses, tu lances /bin/sh pour
exécuter ta commande, cela ne l'exécute pas dans ton shell courant :
tu ne récupères donc pas l'environnement actuel, tu te contentes
d'avoir celui par défaut de /bin/sh.

--
Denis



Avatar
Benoit Izac
Bonjour,

le 11/09/2006 à 14:28, a écrit dans le message
:

j'ai lance un simple:
$jobid=`/bin/echo $JOBID`
mais ma variable $jobid est vide..

qu'est ce que je rate?


Les variables d'environnement sont disponibles dans %ENV.
Il me semble que tu cherches $ENV{jobid} :

#!/bin/sh
jobid="foobar"
export jobid
perl -e 'print "$ENV{jobid}n"'

ah oui. nickel.

$jobid = $ENV{'JOBID'};

Mais pourquoi l'expression avec le /bin/echo ne fonctionne pas?
si je fais un /bin/date, ca fonctionne.


Parce que Perl essaye d'interpréter cette variable :

% perl -e 'print `/bin/echo $TERM`'

% perl -we 'print `/bin/echo $TERM`'
Name "main::TERM" used only once: possible typo at -e line 1.
Use of uninitialized value in concatenation (.) or string at -e line 1.

% perl -Mstrict -we 'print `/bin/echo $TERM`'
Global symbol "$TERM" requires explicit package name at -e line 1.
Execution of -e aborted due to compilation errors.
% perl -Mstrict -we 'print `/bin/echo $TERM`'
xterm

--
Benoit Izac



Avatar
Paul Gaborit
À (at) 11 Sep 2006 05:28:32 -0700,
écrivait (wrote):
j'ai lance un simple:
$jobid=`/bin/echo $JOBID`
mais ma variable $jobid est vide..
[...]



ah oui. nickel.
$jobid = $ENV{'JOBID'};

Mais pourquoi l'expression avec le /bin/echo ne fonctionne pas?
si je fais un /bin/date, ca fonctionne.


Parce que $JOBID est d'abord interpolé par Perl et comme ce n'est pas
une variable de votre programme elle est indéfinie et donc remplacée
par la chaîne vide. Un 'use warnings;' en début de programme vous
aurait prévenu du bug.

Essayez :
$jobid = `/bin/echo $JOBID`;
et vous verrez que ça marche (même si c'est extrêmement inefficace).

Il vaut mieux utiliser %ENV pour manipuler les variables
d'environnement directement,

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>



Avatar
Nicolas George
"Denis" wrote in message
:
Lorsque tu utilises les apostrophes inverses, tu lances /bin/sh pour
exécuter ta commande, cela ne l'exécute pas dans ton shell courant :
tu ne récupères donc pas l'environnement actuel, tu te contentes
d'avoir celui par défaut de /bin/sh.


Non, pas du tout : l'environnement d'un processus est hérité de son
processus père. Il peut ensuite être modifié, mais si ton /bin/sh modifie
l'environnement au delà d'IFS quand il exécute un script, il est cassé.

Avatar
Denis
Bonjour,

tu ne récupères donc pas l'environnement actuel, tu te contentes
d'avoir celui par défaut de /bin/sh.
Non, pas du tout : l'environnement d'un processus est hérité de son

processus père.


Au temps pour moi, j'ai été trompé par ce passage de perlop :

----
qx/STRING/
`STRING`
A string which is (possibly) interpolated and then executed as a system
command with /bin/sh or its equivalent. Shell wildcards, pipes, and
redirections will be honored.
----

J'en avais conclu qu'on exécutait /bin/sh avec son environnement par
défaut. Quelqu'un sait-il où je peux signaler cette ambiguité de la
perldoc ?

--
Denis


1 2