ProcessBuilder environment variable in java
Alfredo O's example gives you the right idea. You need to tell the ProcessBuilder what program to use to execute your command. In this case bash with the "-c" switch, which tells bash to interpret what comes next (i.e. "echo $u") as a command.
import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Map;public class OTU { public static void main(String[] args) throws Exception { ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "echo $u"); Map<String, String> env = pb.environment(); // set environment variable u env.put("u", "util/"); Process p = pb.start(); String output = loadStream(p.getInputStream()); String error = loadStream(p.getErrorStream()); int rc = p.waitFor(); System.out.println("Process ended with rc=" + rc); System.out.println("\nStandard Output:\n"); System.out.println(output); System.out.println("\nStandard Error:\n"); System.out.println(error); } private static String loadStream(InputStream s) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(s)); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) sb.append(line).append("\n"); return sb.toString(); }}
This produces the following output:
Process ended with rc=0Standard Output:util/Standard Error:
This works for me in Windows:
@Testpublic void testProcessBuilder() throws IOException { ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/C", "echo Hello %name%"); Map<String, String> environment = processBuilder.environment(); environment.put("name", "Alfredo Osorio"); Process p = processBuilder.start(); String line; BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); while ((line = r.readLine()) != null) { System.out.println(line); } r.close();}
Output:
Hello Alfredo Osorio
As you can see in Windows you use the %environmentVariable% instead of the $environementVariable