有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java运行时。运行shell脚本的exec无法打开文件

我正在使用运行时。getRuntime()。exec()从java代码运行shell脚本

    String[] cmd = {"sh",  "build.sh", "/Path/to my/sh file"};
    try{
        Process proc = Runtime.getRuntime().exec( cmd );
    }
    catch(Exception e){
        System.out.println("Exception is:"+e);
    }

它在控制台中提供以下输出:

sh: Can't open build.sh

我是不是走错了路?不明白为什么会发生这种事

编辑

根据这里的评论,我将String[] cmd = {"sh", "build.sh", "/Path/to my/sh file"};修改为String[] cmd = {"sh", "/Path/to my/sh file/build.sh", "/Path/to my/sh file"};。现在的问题是这个脚本需要从一个特定的路径执行。在命令提示符下执行此脚本时,首先将目录更改为该路径并执行它。我应该如何修改此代码


共 (4) 个答案

  1. # 1 楼答案

    使用ProcessBuilder并将进程的工作目录设置为脚本实际所在的目录:

    final ProcessBuilder pb = new ProcessBuilder("/bin/sh", "script.sh", "whatever",
        "arguments", "go", "here");
    pb.directory(new File("/path/to/directory"));
    // redirect stdout, stderr, etc
    final Process p = pb.start();
    

    ^{} javadoc。它包含了一个你能做什么的例子Runtime.exec()是过去式:p

  2. # 2 楼答案

    问题是“sh”命令无法将相对路径"build.sh"解析为绝对路径。最可能的解释是"build.sh"在启动命令时不在当前目录中

    假设"/Path/to my/sh file"字符串是"build.sh"文件的路径,您需要像这样运行它:

    String[] cmd = {"/bin/sh",  "/Path/to my/sh file/build.sh"};
    try {
        Process proc = Runtime.getRuntime().exec(cmd);
        ...
    

    (..或使用ProcessBuilder的等效物)

    另一方面,如果"/Path/to my/sh file"字符串应该是"build.sh"脚本的参数,那么您需要这样运行它:

    String[] cmd = {"/bin/sh", "/some/dir/build.sh", "/Path/to my/sh file"};
    try {
        Process proc = Runtime.getRuntime().exec(cmd);
    

    @fge的回答给出了另一种方法。在启动子进程之前,他正在设置子进程的当前目录。这是你的更新的问题的正确解决方案

  3. # 3 楼答案

    试试这个:

     String[] cmd = {"sh build.sh", "/Path/to my/shfile"};
    

    最好使用ProcessBuilder

    ProcessBuilder pb = new ProcessBuilder("sh build.sh", "/Path/to my/shfile"); 
    
  4. # 4 楼答案

    sh找不到build.sh脚本。要解决这个问题,可以提供build.sh的完整路径