我有两个Perl脚本和GIT钩子脚本.在那里我正在验证GIT工作流程.这是调用堆栈的脚本.
预推 – > unpush-changes – >依赖关系树
unpush-changes perl脚本中有一个for循环,它将调用dependency-tree perl脚本.
前推
system("unpushed-changes"); my $errorMsg = $ENV{'GIT_FLOW_ERROR_MSG'}// ''; if($errorMsg eq "true"){ print "Error occured!"; }
unpush-changes.pl
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
if(system("mvn clean compile -DskipTests")==0){ print "successfully build"; return 1; }else{ $ENV{'GIT_FLOW_ERROR_MSG'} = 'true'; print "Error occured"; return 0; }
在我的依赖树脚本中,如果发生错误,我已经设置了ENV变量,并且将在unpush-changes脚本中的每次迭代中进行检查.但是它的ENV值为空而不是true.我也尝试返回一些值,如果失败并尝试验证它,但似乎它也没有工作.所以我的要求是我如何在所有脚本之间共享一个全局变量.如果有更好的方法,请告诉我.
解决方法
通常,子进程从其父进程继承环境的单独副本,并且子进程所做的更改不会传播到父环境.
Env::Modify
提供了解决此问题的解决方法,该问题实现了perlfaq所讨论的
“shell magic”.
典型用法:
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" ...