【问题标题】:How can I export the calling environment correctly into a subshell in Perl?如何将调用环境正确导出到 Perl 的子 shell 中?
【发布时间】:2012-07-19 01:08:23
【问题描述】:

我正在尝试使用 Perl 脚本在我们拥有的工具 (wpj) 中添加某些目录。直接命令看起来像

 $ wpj add path/to/desired/library makefile.wpj

我想做一个脚本来自动化这个,因为很多事情都要做。但是,设置了一组非常特殊的环境变量来制作“wpj”。如果我用 Perl 的反引号调用 wpj,则调用失败。可以看下面的代码

$command = "wpj add library path\\to\\file.wpj \\path\\to\\add";
print $command."\n";
$result = `$command`;
print "->".$result."\n";

为此我得到了

wpj: not found

但是,来自 shell 的相同调用成功了。有的东西没有正确导出,能否请你给我一些关于如何将调用环境导出到反引号创建的子shell的建议?

【问题讨论】:

    标签: perl path environment


    【解决方案1】:

    检查 PATH 并根据需要修改其内容:

    use Env qw(@PATH);
    
    # check the PATH:
    print join("\n", @PATH);
    
    # modify its content:
    push @PATH, "/usr/bin/wpj";
    

    The official manual 用于此模块。

    【讨论】:

    • 对不起,但检查得更仔细,它不起作用,我的意思是,有没有什么方法可以在通过 system() 或反引号启动系统命令时使用调用脚本的环境` `。谢谢。
    • @Pedro Perez,是的。你不必做任何特别的事情。子代继承父代的环境。
    【解决方案2】:

    无需您执行任何操作即可继承环境。我怀疑wpj 不是可执行文件,而是shell 别名。因此,您需要在定义了该别名的 shell 中运行该命令。这可能需要一个交互式 shell,具体取决于您创建别名的方式。

    system('bash', '-i', '-c', 'wpj add path/to/desired/library makefile.wpj');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2019-07-24
      • 2011-04-19
      • 2014-03-29
      • 1970-01-01
      相关资源
      最近更新 更多