java.lang.Process是否可以从另一个java.lang.Process继承环境变量?

java.lang.Process是否可以从另一个java.lang.Process继承环境变量?,java,groovy,Java,Groovy,我正试图使用groovy在unix上编写shell脚本,但我不希望一个进程保留另一个进程更改的环境变量。比如说, def p1 = ["bash", "-c", "source /some/setEnv.sh"].execute() defp1=[“bash”、“-c”、“source/some/setEnv.sh”].execute() 现在,我想要第二个进程p2来继承p1中设置的环境变量。我该怎么做?在java.lang.Process或其groovy扩展中,我没有看到任何东西会在进程执行后

我正试图使用groovy在unix上编写shell脚本,但我不希望一个进程保留另一个进程更改的环境变量。比如说,

def p1 = ["bash", "-c", "source /some/setEnv.sh"].execute() defp1=[“bash”、“-c”、“source/some/setEnv.sh”].execute()
现在,我想要第二个进程p2来继承p1中设置的环境变量。我该怎么做?在java.lang.Process或其groovy扩展中,我没有看到任何东西会在进程执行后吐出环境变量。

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

你有没有想过

  • 在第二个过程中嵌入设置环境变量的脚本
  • 让第一个进程设置环境变量,转储它们,让Java进程在调用第二个进程(via)的同时读取并设置变量
    如果必须在shell脚本中定义环境veriables,请执行以下操作:

    def p = ["bash", "-c", "source /some/setEnv.sh ; somecmd /foo/bar"].execute()
    
    这将使用
    /some/setEnv.sh
    定义的环境变量运行
    somecmd

    一个更复杂的选择可能是:

  • 运行
    bash-c源代码;env
    来自Java
  • 解析上面的输出以提取有效的环境变量,并将它们转换为Java环境变量映射
  • 使用新环境创建/运行您调用的流程
    p2

  • 重要的是要理解这是UNIX/Linux工作方式的结果,而不是Java API的缺点。UNIX/Linux说环境变量的“作用域”是OS级进程,一个进程不能读取或设置另一个进程的环境变量。环境变量状态从一个进程转移到另一个进程的唯一时间是创建子进程的时候。

    也可以考虑创建一个临时脚本文件,其中包含要运行的脚本和在BASH中运行的脚本。因为我需要运行一系列依赖于//Endo/StEnv.Sh的UNIX命令,我认为你更复杂的选择可能是正确的选择。我想另一种选择是在Unix shell中运行/some/setEnv.sh,然后从同一Unix shell进程调用Groovy脚本。