如何在父Perl脚本中使用子shell脚本导出的环境变量?

时间:2016-02-16 21:49:31

标签: perl shell

从我的PERL脚本中,我正在调用子shell脚本。 子shell脚本导出的db环境变量很少 但是当我尝试在perl脚本中使用它们时,它们不会显示。这是我的代码:

my $commanLine = ". SetConnection.sh -n $TaskName"; 
system $commanLine; 
my $dbConnectString = "$ENV{'DB_USER'}/$ENV{'DB_PASSWORD'}"; 
print "$dbConnectString";

请建议。

1 个答案:

答案 0 :(得分:1)

TL; DR

导出的变量由父进程的子进程继承。您无法直接从子进程修改父进程的环境,但您当然可以使用文件,管道或其他形式的进程间通信来交换数据。

获取Perl文件持有变量

最简单的解决方案是让子进程编写一个文件,然后由父进程提供。例如,除了安全问题之外, SetConnection.sh 可以写入 /tmp/variables.pl 之类的文件,然后您可以在父脚本中将其作为Perl脚本来源

例如,考虑以下文件,可能是由子进程编写的:

# /tmp/foo.pl
$foo='bar';

现在您{1}}父脚本中的文件:

require

这不是非常安全,但它 工作。可以认为它与$ perl -e 'require "/tmp/foo.pl"; print "$foo\n"' bar 类似,以及竞争条件和访问问题。然而,这是一个非常务实的解决方案。

使用真实配置文件

或者,您可以使用JSON,YAML或CSV等格式(以您喜欢的方式创建,包括您的子进程创建)来创建配置文件,然后您可以解析值。这通常是最好的方法,但您的使用案例可能会有所不同。

这种方法的好处是您可以验证和清理值,而不必担心临时文件的安全性或唯一性。这是做这些事情的正确方法,但是你需要做更多的工作。