我有一个需要从干净的环境中调用的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
哈希正确?
答案 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来处理中间结果是一种更好的处理模型。