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

我正在使用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"}; to String[] cmd = {"sh", "/Path/to my/sh file/build.sh", "/Path/to my/sh file"}; 。 现在问题是这个脚本需要从特定路径执行。 当我从命令提示符执行此脚本时,我首先将目录更改为该路径并执行它。 我该如何修改此代码?

使用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

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

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

尝试这个:

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

最好使用ProcessBuilder

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