2016-09-24 99 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); 

注意:爲了您的實際問題,這將是足夠的。但是對於產生較長錯誤/輸出的過程,您需要在單獨的線程中讀取標準錯誤/輸出。如果不是,系統進程會在錯誤/輸出緩衝區滿時阻塞,並等待它被外部消耗,並且如果在之後將讀取循環放置在之後,則該進程將不會執行,因此程序將進入死鎖