gpt4 book ai didi

java - 在 Java 中执行命令而不重定向输出

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:25:20 25 4
gpt4 key购买 nike

如何从 Java 程序运行外部命令(通过 shell),这样就不会发生重定向,并等待命令结束?我希望外部程序的文件描述符与 Java 程序的文件描述符相同。特别是我不希望将输出重定向到 Java 程序正在读取的管道。让 Java 程序中继输出不是解决方案。

这意味着 java.lang.Runtime.exec 的简单调用不是解决方案。我假设 java.lang.ProcessBuilder涉及到,但如何指定输出流和错误流必须与调用 Java 进程相同?

class A {
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("echo", "foo");
/*TODO: pb.out = System.out; pb.err = System.err;*/
Process p = pb.start();
p.waitFor();
} catch (Exception e) {
System.err.println(e);
System.exit(1);
}
}
}

(这可能是也可能不是正确的方法。)

换句话说,我正在寻找 Java 的系统,但我所能找到的(大致)是popen

下面是中继无法工作的情况的示例:如果子进程同时写入 stdout 和 stderr,并且 Java 程序正在中继,那么 Java 程序无法知道写入 的顺序> 在子进程中调用。因此,如果两个流最终出现在同一个文件中,Java 程序在 stdout 和 stderr 上的输出顺序将明显不同。混合 stdout 和 stderr 当然不是解决方案,因为调用者可能希望将它们分开。

虽然我认为这个问题很受欢迎,但特定于 Linux 的解决方案可以解决我眼前的问题。

最佳答案

这是 ProcessBuilder.redirectError 的意图/redirectOutput这是在 Java 7 中引入的。使用 Redirect.INHERIT将使子进程与 Java 进程共享 stderr/stdout:

class A {
public static void main(String[] args) {
try {
ProcessBuilder builder = new ProcessBuilder("echo", "foo");
builder.redirectError(ProcessBuilder.Redirect.INHERIT);
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
Process p = builder.start();
p.waitFor();
} catch (Exception e) {
System.err.println(e);
System.exit(1);
}
}
}

关于java - 在 Java 中执行命令而不重定向输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com