我正在调用系统,主要是cd
命令,因为某些函数需要从我系统上的某些目录调用。但是,我注意到一旦呼叫结束,该呼叫的效果就会丢失。
例如,假设我从/home/project
开始,然后调用:
system("setenv home/project/env/NeededEnvironment");
system("make cfile.o");
第二个系统调用不知道第一次调用设置文件编译所需的环境。我已经尝试将它们放入一个由;
分隔的系统调用中,但是遇到了同样的问题。反正有没有得到第一次通话的效果?
答案 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