[英]Command works in terminal, but not with Runtime.exec
我正在尝试使用Runtime.getRuntime().exec(command)
从Java应用程序运行一些命令。 但是,某些命令行工具(如终端)的命令在执行时会失败。
例:
private static final String COMMAND = "cp -n /home/me/Downloads/a.png /home/me/Downloads/b.png";
private static final String COMMAND_2 = "cp -n /home/me/Downloads/a.png /home/me/Downloads/b.png && cp -n /home/me/Downloads/a.png /home/me/Downloads/b.png";
public static void main(String[] args) throws Exception {
int result = Runtime.getRuntime().exec(COMMAND).waitFor();
System.out.println(result); // prints 0
int result2 = Runtime.getRuntime().exec(COMMAND_2).waitFor();
System.out.println(result2); // prints 1
}
请注意, COMMAND_2
与COMMAND
相同两次,由&&
分隔。 为什么一个成功,但另一个失败? 两个都在终端工作得很好。
我在Red Hat Enterprise Linux 6上使用Oracle-Java 1.7.0。
这是所有时代最常见的错误,当涉及到一个Process
。
进程不是shell解释器 。 因此,任何特殊的shell“关键字”都不会被解释。
如果您尝试执行cmd1 && cmd2
,那么该过程的参数实际上是cmd1
, &&
, cmd2
。 不要那样做。
更重要的是,不要使用Runtime.exec()
。 请改用ProcessBuilder
。 示例代码:
final Process p = new ProcessBuilder("cmd1", "arg1", "arg2").start();
final int retval = p.waitFor();
查看ProcessBuilder
的javadoc,它有很多细节。
哦,如果你使用Java 7,甚至不用使用外部命令。 Java 7有Files.copy()
。
而且, man execve
也是如此。
该命令及其每个参数必须是String数组中的单独项。 例如:
private static final String[] COMMAND = { "cp", "-n", "/home/me/Downloads/a.png", "/home/me/Downloads/b.png" };
....
int result = Runtime.getRuntime().exec(COMMAND).waitFor();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.