我在理解为什么源命令行的csh命令在命令行中工作正常但在合并到Perl脚本时无法正常工作时遇到了一些麻烦。
my @envvar = ();
if (-e $ENV{WSDIR}."/<script>.csh") {
@envvar = `csh -c "cd $WSDIR ; source <script>.csh ; env"`;
}
运行时我在Perl脚本中收到如下错误 script.csh:没有这样的文件或目录,而从终端作为csh命令运行按预期工作。在Perl中的csh命令中使用环境变量有什么限制?我如何克服这个问题。
答案 0 :(得分:6)
$WSDIR
被perl
插入到空字符串中。你需要转义'$'以便将它发送到shell,它可以根据需要扩展$WSCIR
。
@envvar = `csh -c "cd \$WSDIR ; source <script>.csh ; env"`;
或者你可以让perl扩展环境变量本身:
@envvar = `csh -c "cd $ENV{WSDIR} ; source <script>.csh ; env"`;
答案 1 :(得分:1)
当perl启动时,它会使自己的子shell。该子shell不包含所有功能,如源shell文件,仅适用于主shell。
您可以通过从CPAN安装外部模块来实现此目的,即Shell :: Source
$env_path= Shell::Source->new(shell=>"tcsh",file=>"../path/to/file/<script>.csh");
$env_path->inherit;
print "Your env path: $ENV{WSDIR}";
由于perl在shell上运行时会创建自己的实例,因此我们无法为主shell设置环境路径,因为perl的实例将类似于主shell的子shell。孩子不能为父母设置环境路径。
现在直到perl的子shell运行,你将能够访问.csh中存在的所有路径