【问题标题】:how to launch a shell script in a new gnome terminal, from a java program如何从 java 程序在新的 gnome 终端中启动 shell 脚本
【发布时间】:2013-12-19 14:10:07
【问题描述】:

我正在尝试从 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 脚本很陌生。请帮忙

提前致谢

【问题讨论】:

  • 你确定,这些命令是在你设置的“OtherPath”里找到的吗?

标签: java bash shell


【解决方案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 类相同的路径中。

【讨论】:

    【解决方案2】:

    不要覆盖整个 PATH...

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

    试试这个

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

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

    【讨论】:

      【解决方案3】:

      您必须先将您的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");
      }
      

      【讨论】:

        【解决方案4】:

        这在 Ubuntu 和 Java 8 上对我有用

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

        前面的代码在指定目录中创建 一个 终端并执行 一个命令

        【讨论】:

          【解决方案5】:

          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();
              }
              }
          } 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-26
            • 2017-02-11
            • 2012-11-18
            • 2023-03-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多