我对系统进行了一些调用,主要是cd
命令,因为需要从系统上的某些目录调用某些函数。然而,我注意到,一旦呼叫结束,该呼叫的效果就会消失。
例如,假设我从/home/project
开始,然后调用:
system("setenv home/project/env/NeededEnvironment");
system("make cfile.o");
第二个系统调用不知道第一个调用设置编译文件所需的环境。我也尝试过将它们放入一个由;
分隔的系统调用中,但也遇到了同样的问题。有没有办法获得保存第一个调用的效果?
发布于 2013-07-17 22:37:55
这就是system
的工作方式:它创建一个子subshell来执行您的命令,当命令完成时,该子subshell退出,您的perl
进程不受影响。
Section 8 of the Perl FAQ也回答了这个问题。
perl {更改目录,修改我的环境}在
脚本中。为什么当我退出脚本时,更改就消失了?如何使我的更改可见?
从最严格的意义上讲,这是不可能的--脚本作为一个与启动它的shell不同的进程来执行。对流程的更改不会反映在其父级中-仅反映在更改后创建的任何子级中。shell有一个魔术,可以让您通过在shell中eval()
脚本的输出来伪造它;有关详细信息,请查看comp.unix.questions FAQ。
您想要的代码类似于
system("cd /home/project/env/NeededEnvironment && make cfile.o") == 0
or warn "$0: make failed";
或者使用-C
选项来make
并避免解析外壳参数,如下所示
system("make", "-C", "/home/project/env/NeededEnvironment", "cfile.o") == 0
or warn "$0: make failed";
发布于 2013-07-17 22:40:36
如果您正在编写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
https://stackoverflow.com/questions/17702621
复制相似问题