Дочерние среды не могут изменять родительские среды.Лучше всего проанализировать env.sh
изнутри кода Perl и установить переменные в %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";
}
Учитывая
foo=5
bar=10
baz="$foo$bar"
quux=`date +%Y%m%d`
при печати
foo => 5
bar => 10
baz => 510
quux => 20110726
Код может обрабатывать только простые файлы (например, он не обрабатывает if
операторов или foo=$(date)
).Если вам нужно что-то более сложное, тогда написание обертки для вашего Perl-скрипта с исходными кодами env.sh
- это правильный путь (это также, вероятно, правильный путь в первую очередь).
Другойпричина для получения env.sh
перед выполнением сценария Perl заключается в том, что установка переменных среды в Perl может произойти слишком поздно для модулей, которые ожидают их увидеть.
В файле foo
:
#!/bin/bash
source env.sh
exec foo.real
где foo.real - ваш Perl-скрипт.