命令在终端中工作,但不在Runtime.exec中

时间:2015-11-09 09:12:35

标签: java linux shell command-line

我尝试使用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_2COMMAND两次相同,以&&分隔。为什么一个成功,但另一个失败?两者都在终端工作得很好。

我在Red Hat Enterprise Linux 6上使用Oracle-Java 1.7.0。

2 个答案:

答案 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();