无法从java进程构建器访问unix shell输出

时间:2017-02-01 16:13:25

标签: java unix processbuilder

我试图从java访问UNIX shell,但输出不同,我不确定原因。

public class Test {

    public static void main(String[] args) throws IOException,InterruptedException {

        List<String> arg = new ArrayList<>();

        arg.add("echo");
        arg.add("$PATH");

        ProcessBuilder pb = new ProcessBuilder(arg);
        Process p = pb.start();

        BufferedReader br;

        if (p.waitFor() == 0) {
            br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        } else {
            br = new BufferedReader(new InputStreamReader(p.getErrorStream()));         
        }

        String str;
        while ((str = br.readLine()) != null) {
            System.out.println(str);
        }
    }
}

输出:

  

$ PATH

然后我尝试阅读~/.bashrc文件以从那里读取PATH。

public class Test {
    public static void main(String[] args) throws IOException,InterruptedException {

        List<String> arg = new ArrayList<>();

        arg.add("cat");
        arg.add("<");
        arg.add("~/.bashrc");

        ProcessBuilder pb = new ProcessBuilder(arg);
        Process p = pb.start();

        BufferedReader br;

        if (p.waitFor() == 0) {
            br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        } else {
            br = new BufferedReader(new InputStreamReader(p.getErrorStream()));         
        }

        String str;
        while ((str = br.readLine()) != null) {
            System.out.println(str);
        }

    }
}

输出:

  

cat:&#39;&lt;&#39;:没有这样的文件或目录

     

cat:&#39;〜/ .bashrc&#39;:没有这样的文件或目录

2 个答案:

答案 0 :(得分:0)

执行时:

cat < ~/.bashrc

你的shell解释了这个命令,并且在没有参数的情况下执行cat,为其 stdin 提供~/.bashrc的内容。

在这里,您直接使用2个参数cat<调用~/.bashrc(顺便提一下,这不是有效的文件名,~需要解释)。

因此,除非您想通过~/.bashrc的内容手动提供进程 stdin ,否则您可以通过替换以下内容启动 shell

arg.add("cat");
arg.add("<");
arg.add("~/.bashrc");

由:

arg.add("bash");
arg.add("-c");
arg.add("cat < ~/.bashrc");

甚至更简单:

Collections.addAll(arg, "bash", "-c", "cat < ~/.bashrc");

甚至更简单:

ProcessBuilder pb = new ProcessBuilder("bash", "-c", "cat < ~/.bashrc");

答案 1 :(得分:0)

如果您需要PATH详细信息,可以使用

System.out.println(System.getenv("PATH"));