How to use environment variables exported by child

2019-09-20 15:35发布

问题:

From my PERL script, I am calling child shell script. There are few db environment variables which are exported by child shell script But when I try to use those in perl script, they are not shown. Here is my code:

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

Please suggest.

回答1:

TL;DR

Exported variables are inherited by child processes from the parent. You can't modify the environment of the parent process from the child directly, but you can certainly exchange data using files, pipes, or other forms of interprocess communication.

Source a Perl File Holding Variables

The easiest solution is to have the child process write a file that can then be sourced by the parent. For example, security issues aside, SetConnection.sh could write to a file like /tmp/variables.pl, which you could then source as a Perl script inside the parent script.

For example, consider the following file, presumably written by the child process:

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

Now you require the file in your parent script:

$ perl -e 'require "/tmp/foo.pl"; print "$foo\n"'
bar

This isn't really very secure, but it does work. Think of it as similar to eval, along with race conditions and access issues. Nevertheless, it's a very pragmatic solution.

Use a Real Configuration File

Alternatively, you could use a format like JSON, YAML, or CSV (created any way you like, including by your child process) to create a configuration file which you could then parse for values. This is generally the best approach, but your use case may vary.

The benefit of this approach is that you can validate and sanitize values, and don't need to worry about the security or uniqueness of temp files. It's really the right way to do these things, but will require much more work on your part.



标签: perl shell