从我的PERL脚本中,我正在调用子shell脚本。
子shell脚本导出的db环境变量很少
但是当我尝试在perl
脚本中使用它们时,它们不会显示。这是我的代码:
my $commanLine = ". SetConnection.sh -n $TaskName";
system $commanLine;
my $dbConnectString = "$ENV{'DB_USER'}/$ENV{'DB_PASSWORD'}";
print "$dbConnectString";
请建议。
答案 0 :(得分:1)
导出的变量由父进程的子进程继承。您无法直接从子进程修改父进程的环境,但您当然可以使用文件,管道或其他形式的进程间通信来交换数据。
最简单的解决方案是让子进程编写一个文件,然后由父进程提供。例如,除了安全问题之外, 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等格式(以您喜欢的方式创建,包括您的子进程创建)来创建配置文件,然后您可以解析值。这通常是最好的方法,但您的使用案例可能会有所不同。
这种方法的好处是您可以验证和清理值,而不必担心临时文件的安全性或唯一性。这是做这些事情的正确方法,但是你需要做更多的工作。