简体   繁体   中英

Collect environment variable in java after running script through ProcessBuilder

Why does the the following code print false ? I am trying to an environment variable in the test.sh script and collect it in java. Please suggest an alternative approach, if possible.

public static void main(String[] args){
ProcessBuilder processBuilder = new ProcessBuilder("test.sh");
Process process;
int exitCode;
try {
    process = processBuilder.start();
    exitCode = process.waitFor();
} catch (IOException e) {
        e.printStackTrace();            
    } catch (InterruptedException e) {
            // TODO Auto-generated catch block
        e.printStackTrace();            
    }
Map<String, String>envVars = processBuilder.environment();
System.out.println(envVars.keySet().contains("SOURCE"));
}

And the code for test.sh script is simply

set SOURCE=source

The ProcessBuilder.environment() method is used for passing the initial environment to the process when you call start() . You cannot get the environment of a subprocess from a parent process. This is not a Java restriction: you can't even get a subprocess environment from a Bash shell script (or in fact anything) that creates a subprocess. You need to find another means of communicating information from the subprocess back to the parent process.

In my opinion, you should change:

ProcessBuilder processBuilder = new ProcessBuilder("test.sh");

to

ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "test.sh");
processBuilder.directory(new File(the-dir-of-test.sh));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM