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

时间:2013-06-17 07:41:16

标签: java shell runtime.exec

我正在使用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

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

修改

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

答案 0 :(得分: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()是过时的:p

答案 1 :(得分:1)

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

答案 2 :(得分:1)

试试这个:

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

并且最好使用ProcessBuilder

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

答案 3 :(得分:1)

问题是“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的回答提供了一种替代方法。在启动子进程之前,他设置子进程的当前目录。这是更新问题的正确解决方案。