java - java中的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 = 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();
    }
}

我得到了错误

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

我不明白为什么我只是为这个进程设置变量会出现错误。 请帮助我如何设置环境变量,以便我可以在 ProcessBuilder 中使用它。

最佳答案

Alfredo O 的例子给了你正确的想法。您需要告诉 ProcessBuilder 使用什么程序来执行您的命令。在这种情况下 bash with the "-c" switch ,它告诉 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();
    }
}

这会产生以下输出:

Process ended with rc=0

Standard Output:

util/


Standard Error:

关于java - java中的ProcessBuilder环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11198678/

相关文章:

java - 在哪里可以找到 Java 和/或 C++ 的快速回顾?

java - Android ListView 仅显示两项中的一项

linux - 如何识别设备(Linux,Unix)

java - 为什么我的代码无法实时更新 JTextArea?

Java ProcessBuilder 和 bash

java - 为什么这段java代码会卡住?

java - 您可以从 Solr 索引中的文档中删除一个字段吗?

java - 使用 Guice 将接口(interface)绑定(bind)到实现它的代理

shell - 在unix下解压受密码保护的zip

c - 管道和插入件