将shell脚本中的变量导出到perl脚本中

时间:2012-12-28 14:30:26

标签: perl bash unix

Perl代码

`. /home/chronicles/logon.sh `; 

print "DATA  : $ENV{ID}\n";

在logon.sh中,我们导出变量“ID”(shell脚本的源代码)。

手动

$> . /home/chronicles/logon.sh
$> echo $LOG

我手动在终端中运行(而非脚本)。我得到了输出。 (但不是从剧本开始工作)

我关注了这篇文章:

How to export a shell variable within a Perl script?

但没有解决问题。

注意

我不允许更改“logon.sh”脚本。

6 个答案:

答案 0 :(得分:2)

反引号内的脚本在子进程中执行。虽然环境变量是从进程继承的,但父进程无法访问子进程的环境。

但是,您可以返回子环境变量的内容并将其放入像

这样的Perl变量中
use strict; use warnings; use feature 'say';
my $var = `ID=42; echo \$ID`;
chomp $var;
say "DATA: $var";

输出:

DATA: 42

这是一个示例shell会话:

$ cat test_script
echo foo
export test_var=42
$ perl -E'my $cmd = q(test_var=0; . test_script >/dev/null; echo $test_var); my $var = qx($cmd); chomp $var; say "DATA: $var"'
DATA: 42

正常输出被重定向到/dev/null,因此只显示echo $test_var

答案 1 :(得分:1)

它无效。

无法从子进程继承环境变量。

环境变量可以在“手动运行”中更新,因为它处于相同的“bash”过程中。

源命令只是在当前shell下运行login.sh中的每个命令。

有关详细信息,请参阅:can we source a shell script in perl script

答案 2 :(得分:1)

好吧,我找到了一个解决方案,对我来说听起来很好:这看起来很健壮,因为这使用了广泛测试的机制来将shell环境绑定到perl(运行perl)和强大的库来导出它们在 perl变量语法中,用于在root perl会话中重新注入。

export COLOR tty非常有用,可以让我的bash导出更新的变量......这看起来很好。

#!/usr/bin/perl -w

my $perldumpenv='perl -MData::Dumper -e '."'".
    '\$Data::Dumper::Terse=1;print Dumper(\%ENV);'."'";

eval '%ENV=('.$1.')' if `bash -c "
        . ./home/chronicles/logon.sh;
        export COLOR tty ID;
        $perldumpenv"`
    =~ /^\s*\{(.*)\}\s*$/mxs;

# map { printf "%-30s::%s\n",$_,$ENV{$_} } keys %ENV;
printf "%s\n", $ENV{'ID'};

无论如何,如果您无法访问logon.sh,则必须信任才能运行此类解决方案。

<强>旧...

我的第一篇文章......出于历史目的,不要再看了。

唯一的方法是解析结果命令,同时请求命令转储environ:

my @lines=split("\n",`. /home/chronicles/logon.sh;set`);

map { $ENV{$1}=$2 if /^([^ =])=(.*)$/; } @lines;

答案 3 :(得分:1)

您可以执行以下操作:

#/usr/bin/perl

use strict;
use warnings;

chomp(my @values = `. myscript.sh; env`);

foreach my $value (@values) {
    my ($k, $v) = split /=/, $value;
    $ENV{$k} = $v;
}

foreach my $key (keys %ENV) {
    print "$key => $ENV{$key}\n";
}

答案 4 :(得分:1)

现在可以使用Env::Modify module

完成此操作
use Env::Modify 'source';
source("/home/chronicles/logon.sh");
... environment setup in logon.sh is now available to Perl ...

答案 5 :(得分:0)

您的Perl进程是shell进程的父进程,因此它不会从中继承环境变量。继承以另一种方式工作,从父母到子女。

但是当您使用反引号运行脚本时,如图所示,脚本的标准输出将返回到Perl脚本。因此,要么修改shell脚本以使用您显示的echo $ LOG语句结束,要么创建一个运行login.sh的新shell脚本,然后使用echo $ LOG。您的Perl脚本将是:

my $value = `./myscript.sh`;
print $value;