2016-09-24 103 views
0

下面是一个Python脚本,“./output回声你好世界>”使用Java的getRuntime.exec()运行Linux Shell命令:如何?

import os 

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

执行Linux的bash命令我试图做与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

各地echo ...额外的报价应删除:

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

的Python版本需要额外的报价告诉底层系统echo Hello World > ./output是一个参数。 java版本明确地将参数指定为单独的字符串,所以它不需要这些引号。

另外,您的版本不会“无投诉地运行”,您只是看不到投诉,因为您没有阅读创建的流程的错误流。

1

标准输入,输出和错误流至/从系统处理从Java开始通过方法getOutputStream()getInputStream()ProcessgetErrorStream()被访问。

我建议你让你的系统的过程中产生的错误输出:

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

注意:为了您的实际问题,这将是足够的。但是对于产生较长错误/输出的过程,您需要在单独的线程中读取标准错误/输出。如果不是,系统进程会在错误/输出缓冲区满时阻塞,并等待它被外部消耗,并且如果在之后将读取循环放置在之后,则该进程将不会执行,因此程序将进入死锁