我想从Perl中获取一个shell脚本,并在Perl中提供环境变量,但我不确定是否有一种优雅的方式来实现它。显然,使用system()
将不起作用,因为它在分叉进程中运行,并且所有环境更改都将丢失。我认为有一个可以做到的CPAN模块,但我不想使用外部模块。
我见过两种在我的情况下不起作用的解决方案:
有一个调用shell脚本的包装器,然后调用Perl脚本。我不知道我需要调用哪个shell脚本。
手动打开shell脚本并抓取arg=value
对。这不起作用,因为shell脚本不是ARG=VALUE
的简单列表,而是包含一堆条件,并且变量可以根据特定条件具有不同的值。
答案 0 :(得分:3)
sh -c "source script; env"
应该在脚本末尾输出环境作为名称=值对,然后您可以从perl脚本中解析(因为Perl是一种用于解析的语言,这应该很容易)。
答案 1 :(得分:1)
您可以通过从CPAN安装外部模块来实现此目的,即Shell :: Source
$env_path= Shell::Source->new(shell=>"tcsh",file=>"../path/to/file/temp.csh");
$env_path->inherit;
由于perl在shell上运行时会创建自己的实例,因此我们无法为主shell设置环境路径,因为perl的实例将类似于主shell的子shell。孩子不能为父母设置环境路径。
现在直到perl的子shell运行,你将能够通过使用Shell :: Source
访问temp.csh中存在的所有路径