Я не знаю, что это поможет, но я был вынужден придумать способ написать это на Perl.Мое намерение состояло в том, чтобы Perl запустил сценарий оболочки и назначил любые переменные оболочки, которые он устанавливает, переменным с одинаковыми именами в сценарии Perl.
Остальные верны в том, что любой сценарий оболочки, который вы «используете», собираетсябыть в под-оболочке.Я подумал, что мог бы использовать «sh -x cmd», чтобы хотя бы оболочка показывала переменные в том виде, в котором они установлены.
Вот что я написал:
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);
Там, безусловно, больше ошибок-вы можете проверить, но это помогло мне, если все, что вы хотите поймать, это переменные оболочки.