使用Java的getRuntime.exec()来运行Linux Shell命令:如何?

时间:2016-09-24 22:38:01

标签: java shell

下面是一个执行linux bash命令的python脚本" echo Hello World> ./output"

import os

os.system("bash -c \"echo Hello World > ./output\"");

我正在尝试用Java做同样的事情。以下是我的最大努力,按照我在此处找到的说明进行操作:Want to invoke a linux shell command from Java

import java.io.IOException;

public class callCommand {
    public static void main(String[] args) {
        try {
            Process p = Runtime.getRuntime().exec(
                new String[]{"bash","-c",
                "\"echo Hello World > ./output\""});
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

它没有问题编译,并且没有投诉地运行,但是没有生成输出文件。

2 个答案:

答案 0 :(得分:2)

应删除echo ...周围的额外引号:

Process p = Runtime.getRuntime().exec(new String[]{
        "bash", "-c",
        "echo Hello World > ./output"
});

python版本需要额外的引号来告诉底层系统echo Hello World > ./output是一个参数。 java版本显式地将参数指定为单独的字符串,因此它不需要这些引号。

此外,您的版本没有投诉并且没有投诉,您只是没有看到投诉,因为您没有阅读创建过程的错误流。

答案 1 :(得分:1)

通过Process的方法getOutputStream()getInputStream()getErrorStream()访问从Java启动的系统进程的标准输入,输出和错误流。 / p>

我建议您获取系统进程产生的错误输出:

Process p = Runtime.getRuntime().exec(...);
InputStream input=p.getErrorStream();
do 
{
    n=input.read(...);
}
while (n>=0);

小心:对于你的实际问题,这就足够了。但是对于产生较长错误/输出的过程,您需要在单独的线程中执行标准错误/输出的读取。如果没有,系统进程将在错误/输出缓冲区已满时阻塞,并等待它被外部消耗,如果您将执行进程后的 >放置在读取循环中,它将永远不会执行所以,该程序将进入死锁