2012-02-21 103 views
-1

有誰知道如何從java應用程序執行shell腳本? 我使用win 7開發java應用程序,腳本文件在我的硬盤上。如何從Java應用程序執行UNIX Shell腳本?

+0

類似於http://stackoverflow.com/questions/525212/how-to-run-unix-shell-script-from-java-code – 2012-02-21 12:25:35

+1

是什麼讓你認爲你可以在Windows 7上運行UNIX Shell腳本機器呢? – 2012-02-21 12:25:49

+0

應用程序應該在windows上運行,而unix shell腳本應該通過該應用程序在Unix服務器上執行。 – itro 2012-02-22 09:13:32

回答

1

您可以在java.lang.Runtime類中使用exec()系列方法。當然,如果不下載像MinGW或Cygwin這樣的軟件來支持它(也許你的意思是當你的程序在另一臺機器上運行時你會執行該腳本),那麼你不能在Windows機器上執行UNIX shell腳本。

+0

您能否提供代碼狙擊如何使用MinGW或Cygwin? – itro 2012-02-27 10:24:54

+0

這些都是您安裝的在Windows上提供UNIX命令行工具(即「bash」,「ls」,「cat」,「mv」和數百個)的環境。然後,您可以像在UNIX上一樣從Java運行它們 - 例如,請參閱@ SarathKumarSivan的答案。 – 2012-02-27 12:07:50

0

首先,要在Windows 7系統上執行Unix shell腳本,您需要一個Unix shell。有幾種可用的,包括cygwin。假設你使用bash(這些日子最常見),要執行的命令是bash -c scriptname來執行你的腳本。如果您只是執行Windows cmd或bat文件,則該命令類似於cmd /c scriptname您應檢查cmd的幫助以驗證此操作。

一旦你開始這個過程,你需要立即啓動一個線程開始讀取它的stdout。您需要從流程中獲取輸出流並開始讀取。如果你不這樣做,兩個過程之間的管道將被填滿,並且子過程將掛起。您還需要爲子進程的stderr執行相同的操作,除非在創建進程時使用該選項合併兩個流。

3

希望這將成爲你的目的:

import java.io.IOException; 
import java.io.InputStream; 

public class RunShellScript { 

    public static void runShellScript(String unixCommand) throws IOException, InterruptedException { 
     ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", unixCommand); 
     processBuilder.redirectErrorStream(true); 
     Process shellProcess = processBuilder.start(); 
     InputStream inputStream = shellProcess.getInputStream(); 
     int consoleDisplay; 
     while((consoleDisplay=inputStream.read())!=-1) { 
      System.out.println(consoleDisplay); 
     } 
     try { 
      inputStream.close(); 
     } catch (IOException iOException) { } 
    } 

    public static void main(String[] args) throws IOException, InterruptedException { 
     String unixCommand = "sh hello-world.sh"; 
     runShellScript(unixCommand); 
    } 
} 

上面的代碼將運行腳本包含在hello-world.sh文件,它會顯示shell腳本控制檯上的輸出。

+0

「ProcessBuilder」的+1。 – trashgod 2012-02-21 19:32:59

+0

上面的代碼與我聯繫工作,但運行應用程序時出錯。 **錯誤:sh.exe停止工作。**原因是什麼? – itro 2012-02-22 09:16:25

+0

你真的在unix機器上試過嗎? – 2012-02-22 16:40:15