首页 文章

java Runtime.exec运行shell脚本 - 无法打开文件

提问于
浏览
2

我使用Runtime.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

我在这里采取了一些错误的做法吗?无法弄清楚为什么他会发生 .

EDIT

根据此处的评论,我已将 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 回答

  • 4

    使用 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();
    

    ProcessBuilder javadoc . 它包含了您可以执行的操作的示例 . Runtime.exec() 是passé:p

  • 1

    sh 无法找到 build.sh 脚本 . 要解决此问题,您可以提供 build.sh 的完整路径 .

  • 1

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

    假设 "/Path/to my/sh file" string是 "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的回答提供了另一种方法 . 他正在为子进程启动之前设置当前目录 . 这是您更新的问题的正确解决方案 .

  • 1

    试试这个:

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

    最好使用ProcessBuilder

    ProcessBuilder pb = new ProcessBuilder("sh build.sh", "/Path/to my/shfile");
    

相关问题