首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过系统修改工艺环境的持续性影响

通过系统修改工艺环境的持续性影响
EN

Stack Overflow用户
提问于 2013-07-17 22:32:26
回答 2查看 66关注 0票数 3

我对系统进行了一些调用,主要是cd命令,因为需要从系统上的某些目录调用某些函数。然而,我注意到,一旦呼叫结束,该呼叫的效果就会消失。

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

代码语言:javascript
运行
复制
 system("setenv home/project/env/NeededEnvironment");
 system("make cfile.o");

第二个系统调用不知道第一个调用设置编译文件所需的环境。我也尝试过将它们放入一个由;分隔的系统调用中,但也遇到了同样的问题。有没有办法获得保存第一个调用的效果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-17 22:37:55

这就是system的工作方式:它创建一个子subshell来执行您的命令,当命令完成时,该子subshell退出,您的perl进程不受影响。

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

perl {更改目录,修改我的环境}在

脚本中。为什么当我退出脚本时,更改就消失了?如何使我的更改可见?

  • Unix

从最严格的意义上讲,这是不可能的--脚本作为一个与启动它的shell不同的进程来执行。对流程的更改不会反映在其父级中-仅反映在更改后创建的任何子级中。shell有一个魔术,可以让您通过在shell中eval()脚本的输出来伪造它;有关详细信息,请查看comp.unix.questions FAQ

您想要的代码类似于

代码语言:javascript
运行
复制
system("cd /home/project/env/NeededEnvironment && make cfile.o") == 0
  or warn "$0: make failed";

或者使用-C选项来make并避免解析外壳参数,如下所示

代码语言:javascript
运行
复制
system("make", "-C", "/home/project/env/NeededEnvironment", "cfile.o") == 0
  or warn "$0: make failed";
票数 9
EN

Stack Overflow用户

发布于 2013-07-17 22:40:36

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

如果需要更改目录,请执行以下操作:

代码语言:javascript
运行
复制
chdir 'some/other/dir';

如果需要设置环境变量:

代码语言:javascript
运行
复制
$ENV{ SOME_VAR } = 'Some value';

更新

下面是一些不应该使用shell等效项的命令:

  • mkdir
  • unlink
  • rmdir

每个人都应该知道的模块:

  • File::Copy
  • File::Path
  • File::Basename
  • File::Spec
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17702621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档