2012-09-02 124 views
4

我試圖用Java運行時運行以下命令:運行Linux命令 - runtime.exe

find /home/Alison/workspace/FunctionalTestFramework/src/com/q1labs/qa/selenium/screens -type d | awk -F/ 'NF <= old_NF {print prev} {old_NF=NF; prev=$0} END {print $0}' 

直接進入終端,但是當命令正常工作時,在下面的函數跑了提供了以下錯誤:

find: paths must precede expression: | 
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] 
Process exitValue: 1 

Java的功能:

 try 
     {    
      Runtime rt = Runtime.getRuntime(); 
      Process proc = rt.exec("find /home/Alison/workspace/FunctionalTestFramework/src/com/q1labs/qa/selenium/screens -type d | awk -F/ 'NF <= old_NF {print prev} {old_NF=NF; prev=$0} END {print $0}'"); 
      InputStream stderr = proc.getErrorStream(); 
      InputStreamReader isr = new InputStreamReader(stderr); 
      BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) 
       System.out.println(line); 
      int exitVal = proc.waitFor(); 
      System.out.println("Process exitValue: " + exitVal); 
     } catch (Throwable t) 
      { 
      t.printStackTrace(); 
      } 
+3

我會建議編碼您的特定shell腳本,並從Java運行該腳本。 –

回答

3

正如我評論,你可以exec外殼,例如/bin/sh-c後跟要解釋的字符串。這就是標準C中的system(3)函數在Unix & Posix系統上的功能。

不過,我只是建議寫一個shell腳本做你的複雜的命令做什麼,和exec是shell腳本。這提供了(測試和改進)該shell腳本而無需更改Java代碼的功能。

0

嘗試replac荷蘭國際集團:

rt.exec("find /home/Alison/workspace/FunctionalTestFramework/src/com/q1labs/qa/selenium/screens -type d | awk -F/ 'NF <= old_NF {print prev} {old_NF=NF; prev=$0} END {print $0}'"); 

本:

rt.exec(new String[]{"find", "/home/Alison/workspace/FunctionalTestFramework/src/com/q1labs/qa/selenium/screens", "-type", "d"}); 

請注意,您將無法運行使用管道|因爲重定向操作符,如管道是一個殼特徵的任何命令,但傳遞給命令exec()不在命令外殼中運行。

+1

你可以執行一個shell,例如'/ bin/sh'用'-c'跟着字符串解釋。這是標準C中'system(3)'函數在Unix和Posix系統上的功能。 –

+0

@BasileStarynkevitch你可以把它作爲一個答案,因爲它的工作,謝謝。 – Colin747