我尝试使用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。
答案 0 :(得分:4)
对于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
。
答案 1 :(得分:-1)
该命令及其每个参数必须是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();