通过系统修改过程环境的持续影响

时间:2013-07-17 14:32:26

标签: perl

我正在调用系统,主要是cd命令,因为某些函数需要从我系统上的某些目录调用。但是,我注意到一旦呼叫结束,该呼叫的效果就会丢失。

例如,假设我从/home/project开始,然后调用:

 system("setenv home/project/env/NeededEnvironment");
 system("make cfile.o");

第二个系统调用不知道第一次调用设置文件编译所需的环境。我已经尝试将它们放入一个由;分隔的系统调用中,但是遇到了同样的问题。反正有没有得到第一次通话的效果?

2 个答案:

答案 0 :(得分:9)

这就是system的工作原理:它创建一个子shell来执行命令,当命令完成时,子shell退出,使perl进程不受影响。

Section 8 of the Perl FAQ也回答了这个问题。

  

我在perl脚本中{更改了目录,修改了我的环境}。当我退出剧本时,改变怎么会消失?如何让我的更改可见?

     
      
  • 的Unix
  •   
     

从最严格的意义上说,它无法完成 - 脚本作为与它从启动的shell不同的进程执行。对进程的更改不会反映在其父级中,也不会反映在更改后创建的任何子级中。有一些shell魔法可能允许你通过eval() shell中的脚本输出来伪造它;有关详细信息,请查看comp.unix.questions FAQ

您希望代码

system("cd /home/project/env/NeededEnvironment && make cfile.o") == 0
  or warn "$0: make failed";

或使用-C选项make并避免shell参数解析,如

system("make", "-C", "/home/project/env/NeededEnvironment", "cfile.o") == 0
  or warn "$0: make failed";

答案 1 :(得分:7)

如果您正在编写Perl脚本,请尽可能少地使用Perl本身和shell-out。

如果您需要更改目录:

chdir 'some/other/dir';

如果您需要设置环境变量:

$ENV{ SOME_VAR } = 'Some value';

<强>更新

以下是一些不应使用shell等效命令的命令:

  • mkdir
  • unlink
  • rmdir

每个人都应该了解的模块:

  • File::Copy
  • File::Path
  • File::Basename
  • File::Spec