2012-05-19 142 views
2

這不是我第一次試圖從Java執行系統命令;但這次它變得非常困難。我有一個從終端執行得很好的腳本。它從一個文件(input.txt)讀取輸入,處理它並將結果導出到另一個文件(ouput.txt)。整件事情持續不超過1秒。但是,當我嘗試從Java執行它時,它會卡住,永遠不會結束。這是我的代碼:Java無法執行系統命令(Ubuntu)

Process p = new ProcessBuilder("./runCalculator.sh").start(); 
p.waitFor(); 

我也試圖與Runtime.getRuntime().exec("./runCalculator.sh"),但都是一樣的。我已經讀取了這個過程的InputStream和ErrorStream。錯誤流不會返回任何內容,但會顯示一條消息,如「開始計算...」

任何想法?

回答

4

您需要使用下面的代碼:

ProcessBuilder pb = new ProcessBuilder(); 
pb.command("bash", "-c", "./runCalculator.sh"); 
Process process = pb.start(); 
int retValue = process.waitFor(); 
+0

謝謝,這對我有用!但爲什麼? –

+1

因爲您必須真正運行「bash」(或「sh」),這是解釋器。並且你傳遞你想執行的命令(對於bash,這是通過'-c'選項傳遞的) –

+0

@Pantelis如果你傳遞給ProcessBuilder ctr的文件是一個可執行文件,你原來的代碼會起作用。因爲它是shell腳本runCalculator.sh,shell(bash或sh)是解釋shell腳本命令並運行它們所需的可執行程序文件。在命令行運行$ file/usr/bin/bash,並將輸出與正在運行的$文件./runCalculator.sh進行比較 –

3

試試這個:

Process p = new ProcessBuilder("sh ./runCalculator.sh").start(); 
0

另外,simplier的解決方案是,你可以通過輸入程序名稱打開程序(這裏假設程序被安裝)而不是創建腳本並調用它。

請注意,程序的名稱並不總是您在Gnome菜單中看到的,例如Gnome的計算器是「gnome-calculator」。

對此事實,你可以通過如下因素線運行計算器:

Process p = Runtime.getRuntime().exec("gnome-calculator"); 

在這種情況下,你沒有必要對任何sh腳本(在你的情況runCalculator.sh)。