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”脚本。
答案 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;