2010-03-26 70 views
0

我想使用groovy在UNIX上执行shell脚本,但我没有任何运气让一个进程保留由另一个进程更改的环境变量。例如,java.lang.Process是否可以继承另一个java.lang.Process的环境变量?

 
    def p1 = ["bash", "-c", "source /some/setEnv.sh"].execute() 

现在,我想要第二个进程p2继承在p1中设置的环境变量。我怎样才能做到这一点?我没有看到java.lang.Process或其groovy扩展中的任何内容,这些扩展在执行该进程后会吐出环境变量。

回答

1

不需要。您需要从第一个进程执行第二个进程(即设置环境变量的进程)。

你有没有想过

  1. 嵌入脚本设置ENV变量在第二个过程?
  2. 获取第一个进程来设置环境变量,将其转储出来,让Java进程读取它们并设置变量,同时调用第二个进程(通过Runtime.exec)。
+0

另外,考虑创建一个临时脚本文件,它嵌入你想运行的脚本并在bash中运行它。 –

1

如果你要得到一个shell脚本定义的环境veriables做这样的事情:

def p = ["bash", "-c", "source /some/setEnv.sh ; somecmd /foo/bar"].execute() 

这将运行somecmd/some/setEnv.sh定义的环境变量。

一个更复杂的替代可能是:

  1. 运行bash -c source ; env从Java
  2. 解析上述的输出,以提取有效的环境变量,把它们变成一个Java环境变量映射。
  3. 用新环境创建/运行您称为p2的过程。

明白,这是方式的结果,即UNIX/Linux下正常工作,不是Java API的缺点是很重要的。 UNIX/Linux认为环境变量的“范围”是一个OS级别的进程,并且一个进程无法读取或设置另一个进程的环境变量。将环境变量状态从一个进程转移到另一个进程的唯一时间是创建子进程时。

+0

因为我需要运行一系列取决于/some/setEnv.sh的unix命令,所以我认为你的更复杂的选择可能是最好的选择。我想另一种方法是在Unix shell中运行/some/setEnv.sh,然后从同一个Unix shell进程中调用Groovy脚本。 –

+0

你最后的想法是最简单/最好的IMO。 –

相关问题