代码之家  ›  专栏  ›  技术社区  ›  codebee

Java Process Linux命令输出重定向

  •  0
  • codebee  · 技术社区  · 1 年前

    当我在RedHat Linux命令行上运行以下命令时,它会运行并将输出重定向到文件: mycommand &> mycommand.log 我想使用Java运行这个命令,但当我这样做时,它会在STDOUT上显示命令输出,而不是写入文件:

    String command = "mycommand &> mycommand.log";
    Process.getRuntime().exec(command);
    

    我不能使用 Process.getInputStream() 因为这个命令是由另一个Java进程执行的,并且它们的Java实现对用户是隐藏的,所以重定向必须在命令中进行,而不是使用Java API。

    1 回复  |  直到 1 年前
        1
  •  3
  •   DuncG    1 年前

    运行命令时 /usr/bin/echo &> xx 在Java中,它不使用shell重定向,而是传递参数 &> xx echo 。您可以通过以下方式进行确认:

    var p = Runtime.getRuntime().exec("/usr/bin/echo &> xx.log");
    p.getInputStream().transferTo(System.out);
    // PRINTS: "&> xx"
    

    在您的案例中,“mycommand”以参数“&>mycommand.log”运行。相反,您需要运行一个shell来进行任何shell重定向处理,最好使用 ProcessBuilder :

    // test with: String command = "/usr/bin/echo &> xx.log";
    var p = new ProcessBuilder("/bin/bash", "-c", command).redirectErrorStream(true).start();
    p.getInputStream().transferTo(System.out);
    // DOES NOT PRINT ANYTHING
    

    上面创建了一个文件: xx.log -在本例中包含一个空行 回响 .