2013-12-19 52 views
0

我試圖從一個java程序運行一個shell腳本(比如myscript.sh)。如何從一個Java程序在新的gnome終端中啓動一個shell腳本

當我從終端運行腳本

,像這樣:

./myscript.sh 

它工作正常。

但是,當我從Java程序調用它,用下面的代碼:

try 
    { 
     ProcessBuilder pb = new ProcessBuilder("/bin/bash","./myScript.sh",someParam); 

     pb.environment().put("PATH", "OtherPath"); 

     Process p = pb.start(); 

     InputStreamReader isr = new InputStreamReader(p.getInputStream()); 
     BufferedReader br = new BufferedReader(isr); 

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

     int exitVal = p.waitFor(); 
    }catch(Exception e) 
    { e.printStackTrace(); } 
} 

它不進入相同的方式。 幾個shell命令(如sed,awk和類似命令)會被跳過,並且根本不會提供任何輸出。

問:是否有某種方法可以在使用java的新終端中啓動此腳本。

PS:我發現「gnome-terminal」命令在shell中啓動一個新的終端, 但是,我無法弄清楚,如何在java代碼中使用相同的命令。

我是使用shell腳本的新手。請幫助

在此先感謝

+0

確定,這些命令在「OtherPath」找到你設置的? – Henry

回答

1

在java中:

import java.lang.Runtime;               

class CLI {                  

    public static void main(String args[]) {          
     String command[] = {"/bin/sh", "-c", 
          "gnome-terminal --execute ./myscript.sh"}; 
     Runtime rt = Runtime.getRuntime();          
     try {                  
      rt.exec(command);              
     } catch(Exception ex) {             
      // handle ex               
     }                   
    }                    

} 

和腳本的內容是:

#!/bin/bash  

echo 'hello!'  

bash 

注:

  • 你會做這在後臺線程或工作人員
  • shell腳本中的最後一個命令是bash;否則執行完成並且終端關閉。
  • shell腳本與調用Java類位於相同的路徑中。
0

不要overrwrite整個PATH ...

pb.environment().put("PATH", "OtherPath"); // This drops the existing PATH... ouch. 

試試這個

pb.environment().put("PATH", "OtherPath:" + pb.environment().get("PATH")); 

或者,使用完整的目錄,以你的命令的腳本文件。

0

你必須設置你的shell腳本文件爲可執行,然後再添加下面的代碼,

shellScriptFile.setExecutable(true); 

//Running sh file 
Process exec = Runtime.getRuntime().exec(PATH_OF_PARENT_FOLDER_OF_SHELL_SCRIPT_FILE+File.separator+shellScriptFile.getName());                
byte []buf = new byte[300]; 
InputStream errorStream = exec.getErrorStream(); 
errorStream.read(buf);        
logger.debug(new String(buf)); 
int waitFor = exec.waitFor(); 
if(waitFor==0) { 
    System.out.println("Shell script executed properly"); 
} 
0

這爲我工作在Ubuntu和Java 8

Process pr =new ProcessBuilder("gnome-terminal", "-e", 
        "./progrm").directory(new File("/directory/for/the/program/to/be/executed/from")).start(); 

上面的代碼創建a終端在指定目錄和執行命令

0

script.sh必須有可執行權限

 public class ShellFileInNewTerminalFromJava { 

     public static void main(String[] arg) { 

    try{ 
    Process pr =new ProcessBuilder("gnome-terminal", "-e", "pathToScript/script.sh").start(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 
} 
相關問題