Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的ProcessBuilder环境变量_Java_Unix_Processbuilder - Fatal编程技术网

java中的ProcessBuilder环境变量

java中的ProcessBuilder环境变量,java,unix,processbuilder,Java,Unix,Processbuilder,我试图为ProcessBuilder对象添加一个环境变量,但是当我在ProcessBuilder中调用该新变量时,我得到一个错误。 这就是我构建流程的方式 public class OTU { public static void main(String[] args) throws Exception { ProcessBuilder pb = new ProcessBuilder(); Map<String, String> env

我试图为ProcessBuilder对象添加一个环境变量,但是当我在ProcessBuilder中调用该新变量时,我得到一个错误。 这就是我构建流程的方式

public class OTU
{
    public static void main(String[] args) throws Exception
    {
        ProcessBuilder pb = new ProcessBuilder();
        Map<String, String> env = pb.environment();
        //set environment variable u
        env.put("u", "util/");

        pb.command("echo $u");
        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();
    }
}
公共类OTU
{
公共静态void main(字符串[]args)引发异常
{
ProcessBuilder pb=新的ProcessBuilder();
Map env=pb.environment();
//设置环境变量u
环境看跌期权(“u”、“util/”);
pb.命令(“echo$u”);
进程p=pb.start();
字符串输出=加载流(p.getInputStream());
字符串错误=加载流(p.getErrorStream());
int rc=p.waitFor();
System.out.println(“进程以rc=“+rc”结束);
System.out.println(“\n标准输出:\n”);
系统输出打印项次(输出);
System.out.println(“\n标准错误:\n”);
系统输出打印项次(错误);
}
私有静态字符串loadStream(InputStream s)引发异常
{
BufferedReader br=新的BufferedReader(新的InputStreamReader);
StringBuilder sb=新的StringBuilder();
弦线;
而((line=br.readLine())!=null)
sb.append(行)。append(“\n”);
使某人返回字符串();
}
}
我得到了错误

Exception in thread "main" java.io.IOException: Cannot run program "$u": java.io.IOException: error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:475)
    at ca.utoronto.siseq_1_2.OTU.main(OTU.java:22)
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:164)
    at java.lang.ProcessImpl.start(ProcessImpl.java:81)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:468)
    ... 1 more
线程“main”java.io.IOException中的异常:无法运行程序“$u”:java.io.IOException:error=2,没有这样的文件或目录 位于java.lang.ProcessBuilder.start(ProcessBuilder.java:475) 位于ca.utoronto.siseq_1_2.OTU.main(OTU.java:22) 原因:java.io.IOException:java.io.IOException:error=2,没有这样的文件或目录 位于java.lang.UNIXProcess(UNIXProcess.java:164) 在java.lang.ProcessImpl.start(ProcessImpl.java:81) 位于java.lang.ProcessBuilder.start(ProcessBuilder.java:468) ... 还有一个 如果我只是为这个过程设置变量,我不明白为什么会出现错误。
请帮助我如何设置env变量,以便我可以在ProcessBuilder中使用它。

这在Windows中适用:

@Test
public 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();
}
@测试
public void testProcessBuilder()引发IOException{
ProcessBuilder ProcessBuilder=new ProcessBuilder(“cmd.exe”、“/C”、“echo Hello%name%”;
映射环境=processBuilder.environment();
环境。put(“名称”、“Alfredo Osorio”);
进程p=processBuilder.start();
弦线;
BufferedReader r=新的BufferedReader(新的InputStreamReader(p.getInputStream());
而((line=r.readLine())!=null){
系统输出打印项次(行);
}
r、 close();
}
输出:

你好,阿尔弗雷多·奥索里奥


正如您在Windows中看到的,您使用%environmentVariable%而不是$environmentVariable

Alfredo O的示例给出了正确的想法。您需要告诉ProcessBuilder要使用什么程序来执行命令。在本例中,它告诉bash将接下来的内容(即“echo$u”)解释为一个命令

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();
    }
}

有没有办法让这个跨操作系统?+1为他指明了正确的方向,尽管没有解释为什么它会起作用-你已经告诉Java为windows平台执行cmd.exe.prefix:
cmd/c…
prefix for unix平台:
sh-c…
Process ended with rc=0

Standard Output:

util/


Standard Error: