2011-05-04 43 views
5

我有一個程序,它是:如何從Java內部運行的進程中獲取bash命令退出代碼?

import java.io.*; 
    import java.util.*; 

    public class ExecBashCommand { 
    public static void main(String args[]) throws IOException { 

     if (args.length <= 0) { 
     System.err.println("Need command to run"); 
     System.exit(-1); 
     } 

     Runtime runtime = Runtime.getRuntime(); 
     Process process = runtime.exec("./nv0914 < nv0914.challenge"); 
     Process process1 = runtime.exec("echo ${?}"); 
     InputStream is = process1.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 

     //System.out.printf("Output of running %s is:", Arrays.toString(args)); 

     while ((line = br.readLine()) != null) { 
     System.out.println(line); 
     } 

    } 
    } 

注:nv0914是一個bash可執行文件並nv0914.challenge是一個文本文件。 當我在終端運行任何正常的命令,並在那之後,如果我使用echo ${?}檢查退出代碼。現在我想用一個程序來做同樣的事情,但程序只是給出輸出${?}。請幫助我!

+3

[process.exitValue()](http://download.oracle.com/javase/6/docs/api/java/lang/Process.html#exitValue())有什麼問題? – eggyal 2011-05-04 16:52:07

+0

我回滾了這個問題的最後一個變化,其中OP部分實施了Peter Lawrey提供的解決方案。這是對這個問題的重大改變,並且使未來的讀者無法使用IMO。 – 2011-05-04 17:33:22

回答

17

Process.waitFor()返回一個int這就是返回代碼的地方。如果你啓動一個不相關的程序,將不會有以前的退出代碼,這就是爲什麼它不返回任何有用的。

您不能可靠地使用exitValue(),因爲您可以在程序結束之前調用它。您應該只把它調用WAITFOR(後)(,它會給出相同的退出代碼WAITFOR()一樣)

從Javadoc文檔exitValue

拋出:IllegalThreadStateException - 如果子由該Process代表對象尚未終止。

+2

他認爲在echo得到它們之前,echo的argv被shell解釋,但它們不是。 – 2011-05-04 16:51:56

+0

嗨,彼得,感謝評論..但它給了我一個錯誤。 – Maverick 2011-05-04 17:01:21

+1

@ mad-programmer,你需要處理InterruptedException。 ;) – 2011-05-04 17:08:37