Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从java程序在新的gnome终端中启动shell脚本_Java_Bash_Shell - Fatal编程技术网

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

如何从java程序在新的gnome终端中启动shell脚本,java,bash,shell,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");

我试图从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脚本非常陌生。请帮忙

提前感谢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类相同的路径中

不要写得太多

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

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

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

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

这在Ubuntu和Java8上对我很有效

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

以前的代码指定的目录中创建新的终端,并执行命令脚本。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();
    }
    }
} 

您确定这些命令位于您设置的“其他路径”中吗?