2

我有点难以理解为什么从命令行获取文件的 csh 命令可以正常工作,但在合并到 Perl 脚本中时却无法正常工作。

  my @envvar = ();
  if (-e $ENV{WSDIR}."/<script>.csh") {
    @envvar = `csh -c "cd $WSDIR ; source <script>.csh  ; env"`;
  }

当我运行 Perl 脚本时,我收到如下错误script.csh: No such file or directory,而从终端作为 csh 命令运行按预期工作。在 Perl 的 csh 命令中使用环境变量有什么限制?我该如何克服这个问题。

4

2 回答 2

6

$WSDIR被插入到空字符串中perl。您需要对“$”进行转义,以便将其发送到外壳,外壳可以$WSCIR根据需要进行扩展。

@envvar = `csh -c "cd \$WSDIR ; source <script>.csh  ; env"`;

或者你可以让 perl 扩展环境变量本身:

@envvar = `csh -c "cd $ENV{WSDIR} ; source <script>.csh  ; env"`;
于 2013-02-27T15:50:42.063 回答
1

当 perl 启动时,它会成为自己的子 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 中存在的所有路径

于 2013-07-10T05:21:43.320 回答