2 votes

Sourcing de scripts shell scripts en Perl

Je veux créer un script shell script à partir de Perl et faire en sorte que les variables d'environnement soient disponibles en Perl, mais je ne suis pas sûr qu'il y ait une façon élégante de le faire. De toute évidence, l'utilisation de system() ne fonctionnera pas car il s'exécute dans un processus forké, et tous les changements d'environnement seront perdus. Je pense qu'il existe un module CPAN qui peut le faire, mais je préfère ne pas utiliser de modules externes.

J'ai vu deux solutions qui ne fonctionneraient pas dans mon cas :

  1. Avoir un wrapper qui appelle le shell script, et qui appelle ensuite le Perl script. Je ne sais pas à l'avance lequel de mes script shell je dois appeler.

  2. Ouvrir manuellement le shell script et rechercher les éléments suivants arg=value paires. Cela ne fonctionnera pas non plus car le shell script n'est pas une simple liste de ARG=VALUE mais plutôt un ensemble de conditionnalités, et les variables peuvent avoir des valeurs différentes en fonction de certaines conditions.

3voto

Paŭlo Ebermann Points 35526

sh -c "source script; env" devrait produire l'environnement à la fin de script sous forme de paires nom=valeur, que vous pouvez ensuite analyser à partir de votre script perl (Perl étant un langage conçu pour l'analyse syntaxique, cela devrait être facile).

1voto

Mak_Thareja Points 63

Vous pouvez le faire en installant un module externe du CPAN qui est Shell::Source

$env_path= Shell::Source->new(shell=>"tcsh",file=>"../path/to/file/temp.csh");
$env_path->inherit;

Comme perl crée sa propre instance lorsqu'il s'exécute sur un shell, nous ne pouvons pas définir de chemin d'environnement pour le shell principal, car l'instance de perl sera comme un sous-shell du shell principal. Les enfants ne peuvent pas définir les chemins d'accès à l'environnement des parents.

Maintenant, jusqu'à ce que le sous-shell perl s'exécute, vous pourrez accéder à tous les chemins présents dans temp.csh en utilisant Shell::Source

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X