簡體   English   中英

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

[英]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_2COMMAND相同兩次,由&&分隔。 為什么一個成功,但另一個失敗? 兩個都在終端工作得很好。

我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM