首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Perl脚本间共享ENV变量

如何在Perl脚本间共享ENV变量
EN

Stack Overflow用户
提问于 2017-06-23 13:42:09
回答 2查看 892关注 0票数 4

我有两个Perl脚本和GIT钩子script.In,在那里我正在验证GIT工作,flow.Here是调用堆栈的脚本。

预推->取消推送更改->依赖树

在撤消更改的perl脚本中有一个for循环,它将调用依赖树perl脚本。

预推

代码语言:javascript
复制
system("unpushed-changes");
  my $errorMsg = $ENV{'GIT_FLOW_ERROR_MSG'}// '';
  if($errorMsg eq "true"){
     print "Error occured!";
   }

unpush-changes.pl

代码语言:javascript
复制
  for my $i (0 .. $#uniqueEffectedProjectsList) {
      my $errorMsg = $ENV{'GIT_FLOW_ERROR_MSG'}// '';
      if($errorMsg ne "true"){
        my $r=system("dependency-tree $uniqueEffectedProjectsList[$i]");
     }else{
        exit 1;
     }

   }

dependency-tree.pl

代码语言:javascript
复制
if(system("mvn clean compile  -DskipTests")==0){
     print "successfully build"; 
     return 1;
 }else{
      $ENV{'GIT_FLOW_ERROR_MSG'} = 'true';
      print "Error occured";
      return 0;
  }

在我的dependency-tree脚本中,如果出现错误,我已经设置了 ENV 变量,这将在unpush-changes script.But中的每个迭代中进行检查,它的ENV值为空值,而不是true。如果失败,我还尝试返回一些值,并尝试验证它,但它似乎也不是working.So,我的要求是,如何在所有scripts.Please之间共享一个全局变量,让我知道是否有更好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-23 14:00:42

通常,子进程从其父进程继承单独的环境副本,并且子进程所做的更改不会传播到父进程的环境。Env::Modify为这个问题提供了一个解决办法,实现perlfaq所讨论的“壳魔法”

典型用法:

代码语言:javascript
复制
use Env::Modify 'system',':bash';

print $ENV{FOO};                   #   ""
system("export FOO=bar");
print $ENV{FOO};                   #   "bar"
...
print $ENV{GIT_FLOW_ERROR_MSG};    #   ""
system("unpushed-changes");
print $ENV{GIT_FLOW_ERROR_MSG};    #   "true"
...
票数 9
EN

Stack Overflow用户

发布于 2017-06-24 14:35:12

正如@mob所提到的,有两种方法可以实现这一点:Env::Modify或者作为perl lib.So,我选择了lib而不是Env::Modify.because,我希望在每台机器上运行这个脚本,不管是否安装了Env::Modify包。

我编写了将/c/lib/My/Utils.pm.和dependency-tree功能捆绑在一起的Utils.pm,并将其保存在Utils.pm下。

Utils.pm

代码语言:javascript
复制
package My::Utils;
use strict;
use warnings;

use Exporter qw(import); 
our @EXPORT_OK = qw(build deploy);

sub build {
 system("mvn clean compile  -DskipTests")
 //Do  other things
}

sub deploy {
 //Do  things
}

1;

然后,我在我的pre-push钩子中使用了以前创建的库。

预推

代码语言:javascript
复制
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename qw(dirname);
use Cwd  qw(abs_path);
use lib dirname(dirname abs_path $0) . '/lib'; 
use My::Utils qw(build deploy); // or use lib '/c/lib';

build();
deploy();

不再需要担心ENV变量.参考文献

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

https://stackoverflow.com/questions/44722935

复制
相关文章

相似问题

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