我使用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 回答
使用
ProcessBuilder
并将进程的工作目录设置为脚本实际所在的目录:见ProcessBuilder javadoc . 它包含了您可以执行的操作的示例 .
Runtime.exec()
是passé:psh
无法找到build.sh
脚本 . 要解决此问题,您可以提供build.sh
的完整路径 .问题是"sh"命令无法将相对路径
"build.sh"
解析为绝对路径 . 最可能的解释是,启动命令时"build.sh"
不在当前目录中 .假设
"/Path/to my/sh file"
string是"build.sh"
文件的路径,您需要像这样运行它:(....或等效使用
ProcessBuilder
)另一方面,如果
"/Path/to my/sh file"
字符串应该是"build.sh"
脚本的参数,那么您需要像这样运行它:@ fge的回答提供了另一种方法 . 他正在为子进程启动之前设置当前目录 . 这是您更新的问题的正确解决方案 .
试试这个:
最好使用ProcessBuilder