使用env -i调用脚本时未填充Perl ENV哈希

时间:2014-03-19 20:31:38

标签: perl environment-variables

我有一个需要从干净的环境中调用的Perl脚本。我调用脚本的方式如下。

env -i test.pl

调用env -i后,某些环境变量保持不变,例如PATH。但是,根据ENV哈希,PATH变量为空。

这是脚本(删节):

#!/usr/bin/perl -w

system('echo "system: $PATH"');
print "perl hash: $ENV{'PATH'}\n";

这是我运行env -i test.pl时的输出:

system: /usr/local/bin:/bin:/usr/bin
Use of uninitialized value in concatenation (.) or string at test.pl line 4.
perl hash:

当我在ENV下调用脚本时,如何才能使env -i哈希正确?

2 个答案:

答案 0 :(得分:3)

-i的{​​{1}}选项实际上将env清除出环境。您发现$PATH电话的结果不一致的原因是system works

  

如果只有一个标量参数,则检查参数   shell元字符,如果有的话,整个参数都是   传递给系统的命令shell进行解析(这是/ bin / sh -c   在Unix平台上,但在其他平台上有所不同)。如果没有   shell中的元字符在参数中,它被分成单词和   直接传递给execvp,效率更高。

因为你用一个必须由shell解析的命令行调用system,所以启动了一个命令行,它在启动时初始化它自己的system(因为shell会这样做),并且&#39你正在看的那个人。

答案 1 :(得分:1)

  

在调用env -i之后,某些环境变量保持不变,例如PATH。但是,根据ENV哈希,PATH变量为空。

在我的rhel系统上,env -i执行:

    -i, --ignore-environment
          start with an empty environment

因此,当你运行Perl程序时,system()调用正在分支一个shell,这可能是在读取一个设置PATH的rc文件。但是当您直接从Perl程序打印$ ENV {PATH}时,它会按预期为空。

您应该手动设置PATH,或者确定要运行的各种可执行文件的完整路径。

如果您要花费大量时间运行system()命令,那么可能是shell脚本,在这种情况下使用一些Perl来处理中间结果是一种更好的处理模型。