【问题标题】:Sourcing Shell scripts from Perl从 Perl 采购 Shell 脚本
【发布时间】:2013-02-27 15:43:57
【问题描述】:

我有点难以理解为什么用于获取文件的 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 命令中使用环境变量有什么限制?我该如何克服这个问题。

【问题讨论】:

  • 始终使用use strict; use warnings;!它会抓住这个的。
  • 对于反引号 - 我总是避免使用它们并使用 qx(csh...) 代替;对我来说更具可读性。

标签: linux perl shell


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    当 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 中存在的所有路径

    【讨论】: