首页 > 解决方案 > Runtime.getRuntime().exec(String command, String[] envp, File dir) API On Mac OSX 无法正确使用提供的环境

问题描述

当我在Mac OSXCatalina 版本 10.15.4 )上使用public Process exec(String command, String[] envp, File dir) API时,子进程没有获得正确的环境变量传递。这有点奇怪,如果 env[] 字符串包含正确传递给子进程的任何已定义的新环境变量,但是修改了现有变量值并将例如 PATH 传递给新值,那么子进程不会获得修改后的值,它得到预先存在的值。

重要说明 这只发生在 Mac OSX、 windows 和 Linux 上,这工作得很好。

下面是我正在使用的代码片段

    StringBuilder cmd = new StringBuilder();
    cmd.append("/usr/bin/open ");
    cmd.append("-F -n -a ");
    cmd.append("Terminal.app ");
    cmd.append(workingDir);
    
    String[] env = new String[5];
    env[0]= "PATH=" + "/home/xxtest/temp"+ ":" + System.getenv("PATH");
    env[1]= "SYSTEM=" + "/home/xxtest/install/testsystem";
    env[2]= "CORE=" + "testcore";
 
    try {
            Runtime.getRuntime().exec(cmd.toString(),env,workingDir);
        } catch (IOException e) {
            
    }

现在当终端应用程序打开并且我检查环境变量时

mac-jup4:onp6 poonamg$ printenv
TERM_PROGRAM=Apple_Terminal
TERM=xterm-256color
SHELL=/bin/bash
TMPDIR=/var/folders/1l/4vsmgmmx1k364y5_j0km08006clg6j/T/
TERM_PROGRAM_VERSION=433
TERM_SESSION_ID=D3D3FDC1-D065-432F-BDF5-73D548AD6462
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.tWljT5bOon/Listeners
SYSTEM=/home/xxtest/install/testsys
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
CORE=testcore
LC_CTYPE=UTF-8
DISPLAY=/private/tmp/com.apple.launchd.EHe3TVLbtI/org.macosforge.xquartz:0
mac-jup4:onp6 poonamg$

您可以看到CORESYSTEM环境变量,但PATH未更新

任何线索为什么会在 OSX 上发生这种情况?

标签: javamacosruntimeexecmacos-catalina

解决方案


推荐阅读