Я не знаю, что это поможет, но я был вынужден придумайте способ написать это в 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);
Там, конечно, более проверки ошибок вы могли бы сделать, но это сделал трюк для меня, если все, что вы хотите, чтобы поймать это переменные оболочки.
любая причина, по которой вы не хотите использовать модули времени даты Perl для этого? – ghostdog74
@ ghostdog74 Вам даже не нужен модуль. Функция «localtime» в скалярном контексте создает почти идентичную строку: 'perl -le 'print scalar localtime'', вам просто нужно получить часовой пояс, и они будут одинаковыми. –
Эй, да, это всего лишь пример ... это может быть любая вещь вместо даты (ls, chown, echo .....), какая команда может быть в первом файле, мне нужно передать perl ; – raghu