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

我在这里遵循一些错误的方法吗?无法弄清楚他为什么会发生。

编辑

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 回答 4

4

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

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

请参阅ProcessBuilderjavadoc。它包含一个你可以做什么的例子。Runtime.exec()过时了:p

于 2013-06-17T08:03:19.433 回答
1

sh找不到build.sh脚本。要解决此问题,您可以提供build.sh.

于 2013-06-17T07:43:09.253 回答
1

试试这个:

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

并且更好地使用 ProcessBuilder

ProcessBuilder pb = new ProcessBuilder("sh build.sh", "/Path/to my/shfile"); 
于 2013-06-17T07:46:03.860 回答
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 的回答提供了另一种方法。他在子进程启动之前为其设置当前目录。这是您更新的问题的正确解决方案。

于 2013-06-17T08:09:32.537 回答