[英]java Runtime.exec to run shell script - cannot open file
我正在使用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()
已通过:p
sh
无法找到build.sh
脚本。 要解决此问题,您可以提供build.sh
的完整路径。
尝试这个:
String[] cmd = {"sh build.sh", "/Path/to my/shfile"};
最好使用ProcessBuilder
ProcessBuilder pb = new ProcessBuilder("sh build.sh", "/Path/to my/shfile");
问题是“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的答案提供了另一种方法。 他正在为子进程启动之前设置当前目录。 这是您更新的问题的正确解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.