如何从java程序在新的gnome终端中启动shell脚本

时间:2013-12-19 14:10:07

标签: java bash shell

我正在尝试从java程序运行一个shell脚本(比如myscript.sh)。

当我从终端运行脚本时,像这样:

./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脚本。请帮忙

提前致谢

5 个答案:

答案 0 :(得分: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类位于同一路径中。

答案 1 :(得分:0)

不要覆盖整个路径......

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

试试这个

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

或者,在脚本文件中使用命令的完整目录。

答案 2 :(得分: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");
}

答案 3 :(得分:0)

这对我在Ubuntu和Java 8上起作用

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="portfolioCtrl">
  <div ng-repeat="project in projects">
            <h3>{{project.title}}</h3>
            <p>{{project.language}}</p>
            <p>{{project.description}}</p>
            <p id="github"><a href="{{project.link}}">Check it out on Github!</a></p>
        </div>
</div>

以前的代码特定的目录中创建 新的终端,执行一个命令

答案 4 :(得分: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();
    }
    }
}