为什么相同的命令可以在bash脚本中工作,但不能直接在Java运行时中工作?

为什么相同的命令可以在bash脚本中工作,但不能直接在Java运行时中工作?,java,bash,Java,Bash,命令cat~/desktop/b.mpg~/desktop/b2.mpg>~desktop/intermediate\u all.mpg似乎不能单独通过Java运行时工作,如下面的示例所示; 然而,当像在第二个例子中那样放入一个.sh文件时,它工作得很好 public class Test { public static void main(final String[] args) { try { Runtime.getRuntime().exec("/users/

命令cat~/desktop/b.mpg~/desktop/b2.mpg>~desktop/intermediate\u all.mpg似乎不能单独通过Java运行时工作,如下面的示例所示;

然而,当像在第二个例子中那样放入一个.sh文件时,它工作得很好

public class Test {
    public static void main(final String[] args)  {
        try { Runtime.getRuntime().exec("/users/nn/desktop/configure.sh"); }
        catch (IOException e) { e.printStackTrace();}
    }
}

有谁能告诉我,当从bash脚本转移到纯Java运行时时,基本流程丢失了什么?仅供参考,我正在使用OSX,已经尝试过使用绝对文件路径,并且了解Process Builder,它具有与使用Java Runtim相同的效果,正如在本论坛上已经说过一千次的那样,因此让我们避免在这一点上击败死马

谢谢

试试这个:

Runtime.getRuntime().exec(new String[] {
    "/bin/bash", "-c", 
    "cat ~/desktop/b.mpg ~/desktop/b2.mpg > ~/desktop/intermediate_all.mpg" })
ProcessBuilder pb = new ProcessBuilder("cat", "~/desktop/b.mpg", "~/desktop/b2.mpg");
pb.redirectOutput(new File("~/desktop/intermediate_all.mpg"));
Process p = pb.start();

正在执行的命令是带参数的cat。命令及其参数必须是数组的独立元素

此外,不能使用Runtime.exec重定向-必须使用ProcessBuilder:

试试这个:

Runtime.getRuntime().exec(new String[] {
    "/bin/bash", "-c", 
    "cat ~/desktop/b.mpg ~/desktop/b2.mpg > ~/desktop/intermediate_all.mpg" })
ProcessBuilder pb = new ProcessBuilder("cat", "~/desktop/b.mpg", "~/desktop/b2.mpg");
pb.redirectOutput(new File("~/desktop/intermediate_all.mpg"));
Process p = pb.start();
shell位置~可能无法理解,因此您可能必须在java代码中使用文件的完整绝对路径 ~/desktop/b.mpg~/desktop/b2.mpg>~desktop/intermediate\u all.mpg,
您必须在>~/desktop/intermediate\u all.mpg

之后给出完整路径,因为在第二种情况下,您实际上正在运行bash、-c、cat etc>文件,其中bash负责为您解析重定向。重定向是shell的特性,而不是cat的特性;如果在没有外壳的情况下运行原始进程,外壳的功能将不可用。

~桌面与~/desktop不同。