Je veux appeler "env.sh" de "my_perl.pl" sans forcer un sous-shell. J'ai essayé avec des backtics et un système comme celui-ci ->system (. env.sh)
[dot space env.sh], cependant ne fonctionnera pas. Sil te plait aide moi.comment créer un script shell [variables d'environnement] dans un script perl sans forcer un sous-shell?
Répondre
Les environnements enfants ne peuvent pas modifier les environnements parents. Votre meilleur pari est d'analyser env.sh
à l'intérieur du code Perl et définir les variables %ENV
:
#!/usr/bin/perl
use strict;
use warnings;
sub source {
my $name = shift;
open my $fh, "<", $name
or die "could not open $name: $!";
while (<$fh>) {
chomp;
my ($k, $v) = split /=/, $_, 2;
$v =~ s/^(['"])(.*)\1/$2/; #' fix highlighter
$v =~ s/\$([a-zA-Z]\w*)/$ENV{$1}/g;
$v =~ s/`(.*?)`/`$1`/ge; #dangerous
$ENV{$k} = $v;
}
}
source "env.sh";
for my $k (qw/foo bar baz quux/) {
print "$k => $ENV{$k}\n";
}
Étant donné
foo=5
bar=10
baz="$foo$bar"
quux=`date +%Y%m%d`
imprime
foo => 5
bar => 10
baz => 510
quux => 20110726
Le code ne peut traiter des fichiers simples (par exemple, il ne gère pas les instructions if
ou foo=$(date)
). Si vous avez besoin de quelque chose de plus complexe, alors écrire d'abord un wrapper pour votre script Perl qui utilise les sources env.sh
est la bonne façon d'y aller (c'est aussi probablement la bonne façon d'y aller en premier lieu). Une autre raison de source env.sh
avant d'exécuter le script Perl est que la définition des variables d'environnement en Perl peut arriver trop tard pour les modules qui attendent de les voir.
Dans le fichier foo
:
#!/bin/bash
source env.sh
exec foo.real
où foo.real est votre script Perl.
Vous pouvez utiliser des scripts shell arbitrairement complexes en les exécutant avec le shell correspondant, en déchargeant leur environnement sur la sortie standard dans le même processus et en analysant cela dans perl. Nourrir la sortie dans autre chose que% ENV ou filtrer pour des valeurs spécifiques d'intérêt est prudent afin de ne pas changer des choses comme PATH qui peuvent avoir des effets secondaires intéressants ailleurs. J'ai supprimé la sortie standard et l'erreur du script shell généré, bien qu'ils puissent être redirigés vers des fichiers temporaires et utilisés pour la sortie de diagnostic dans le script Perl.
foo.pl:
#!/usr/bin/perl
open SOURCE, "bash -c '. foo.sh >& /dev/null; env'|" or
die "Can't fork: $!";
while(<SOURCE>) {
if (/^(BAR|BAZ)=(.*)/) {
$ENV{$1} = ${2} ;
}
}
close SOURCE;
print $ENV{'BAR'} . "\n";
foo.sh: export BAR = baz
Essayez ceci (exemple de code unix):
cd/tmp
vi s
#!/bin/bash
export blah=test
vi t
#!/usr/bin/perl
if ($ARGV[0]) {
print "ENV second call is : $ENV{blah}\n";
} else {
print "ENV first call is : $ENV{blah}\n";
exec(". /tmp/s; /tmp/t 1");
}
chmod 777 s t
./ T
ENV premier appel est:
ENV deuxième appel est: Test
L'astuce utilise l'exécutif à la source de votre script bash d'abord, puis d'appeler votre script Perl à nouveau avec un argument si tu sais que vous êtes appelé pour une deuxième fois.
- 1. Variables globales dans un script shell?
- 2. Variables d'environnement globales dans un script shell
- 3. pouvons-nous trouver un script shell dans le script Perl?
- 4. Comment puis-je convertir un script shell en script Perl?
- 5. Forcer un script shell à fflush
- 6. Comment appeler un script Shell avec des arguments variables d'un script Perl?
- 7. Comment créer un fichier dans un script shell
- 8. Comment exécuter un script Perl depuis un script Perl?
- 9. impossible d'invoquer un script perl à partir d'un script shell
- 10. créer des graphiques avec un script shell
- 11. Vous voulez exécuter un script Perl dans un script Perl
- 12. un script de shell shell
- 13. Appel d'un script Perl depuis un script Perl
- 14. Comment invoquer un script PHP en utilisant un script shell?
- 15. Comment comparer un script shell?
- 16. Comment installer un script shell?
- 17. Comment lancer un script ant depuis un script shell?
- 18. Un script shell "try"
- 19. Comment créer un raccourci Windows pour exécuter un script Perl?
- 20. Shell Script à l'intérieur du script Perl
- 21. Ajouter un compteur dans un script shell
- 22. Script Shell avec variables
- 23. Comment utiliser les variables dans un autre script shell dans une boucle dans mon script principal?
- 24. Utiliser un script Perl sur Windows sans installer ActivePerl?
- 25. Comment exécuter un script shell dans cygwin?
- 26. Comment utiliser Router dans un script shell?
- 27. Manipuler une chaîne dans un script shell
- 28. Comment utiliser les variables dans un autre script shell dans mon script?
- 29. Transmettre la variable d'un script perl vers un script shell dans Unix
- 30. script Perl faire un modèle dans les variables
L'utilisation de 'env' ne fonctionne que si le script shell exporte délibérément les variables. Si le script ne les exporte pas spécifiquement, essayez 'set' au lieu de 'env'. – EdwinW