从Perl获取Shell脚本

时间:2013-02-27 15:43:57

标签: linux perl shell

我在理解为什么源命令行的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命令中使用环境变量有什么限制?我如何克服这个问题。

2 个答案:

答案 0 :(得分:6)

$WSDIRperl插入到空字符串中。你需要转义'$'以便将它发送到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中存在的所有路径