Sourcing shell scripts in Perl
I want to source a shell script from within Perl and have the environment variables be available in Perl, but I'm开发者_JAVA技巧 not sure if there's an elegant way to do it. Obviously, using system()
won't work since it runs in a forked process, and all environment changes will be lost. I think there's a CPAN module that can do it, but I prefer not to use external modules.
I've seen two solutions that would not work in my case:
Have a wrapper that calls the shell script, and then calls the Perl script. I do not know ahead of time which of my shell scripts I need to call.
Manually opening the shell script and scraping for
arg=value
pairs. This won't work either because the shell script is not a simple list ofARG=VALUE
, but rather contain a bunch of conditionals, and variables can have different values depending on certain conditions.
sh -c "source script; env"
should output the environment at the end of script as name=value pairs, which you then can parse from your perl script (as Perl is a language made for parsing, this should be easy).
You can do this by installing external module from CPAN which is Shell::Source
$env_path= Shell::Source->new(shell=>"tcsh",file=>"../path/to/file/temp.csh");
$env_path->inherit;
As perl creates its own instance while running on a shell, so we can not set environment path for the main shell as the perl's instance will be like sub shell of the main shell. Child can not set environment paths for parents.
Now till the perl's sub shell will run you'll be able to access all the paths present in temp.csh by using Shell::Source
精彩评论