Je ne sais pas que cela va aider, mais je me suis senti obligé de trouver un moyen d'écrire cela en Perl. Mon intention était de faire en sorte que Perl exécute un script shell, et d'assigner toutes les variables de shell qu'il définit à des variables similaires dans le script Perl.
Les autres sont corrects dans le fait que tout script shell que vous "source" va être dans un sous-shell. J'ai pensé que je pourrais utiliser "sh -x cmd" pour au moins que le shell affiche les variables telles qu'elles sont définies.
Voici ce que je l'ai écrit:
use strict; use warnings;
our $DATE;
my $sh_script = "./test1.sh";
my $fh;
open($fh, "sh -x '$sh_script' 2>&1 1>/dev/null |") or die "open: $!";
foreach my $line (<$fh>) {
my ($name, $val);
if ($line =~ /^\+ (\w+)='(.+)'$/) { # Parse "+ DATE='/bin/date;'
$name = $1;
($val = $2) =~ s{'\\''}{'}g; # handle escaped single-quotes (eg. "+ VAR='one'\''two'")
} elsif ($line =~ /^\+ (\w+)=(\S+)$/) { # Parse "+ DATE=/bin/date"
$name = $1;
$val = $2;
} else {
next;
}
print "Setting '$name' to '$val'\n" if (1);
# NOTE: It'd be better to use something like "$shell_vars{$name} = $val",
# but this does what was asked (ie. $DATE = "/bin/date")...
no strict 'refs';
${$name} = $val; # assign to like-named variable in Perl
}
close($fh) or die "close: ", $! ? $! : "Exit status $?";
print "DATE: ", `$DATE` if defined($DATE);
Il vous est certainement plus de contrôle d'erreur pouvait faire, mais cela a fait l'affaire pour moi, si tout ce que vous voulez capturer est variables shell.
quelle raison vous ne voulez pas utiliser les modules de date-heure de Perl pour cela? – ghostdog74
@ ghostdog74 Vous n'avez même pas besoin d'un module. La fonction 'localtime' dans un contexte scalaire produit une chaîne presque identique:' perl -le 'print scalar localtime'', vous avez juste besoin d'obtenir le fuseau horaire et ils seront identiques. –
Hey Date est juste un exemple ... il peut être n'importe quoi à la place de la date (ls, chown, echo .....) quelle que soit la commande peut être dans le premier fichier que je dois source à la perl ; – raghu