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

标签 java exec file-descriptor

如何从 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/

相关文章:

java - 使用自定义 jackson 序列化器替换Enum值

java - 在没有类型安全警告的情况下覆盖通用抽象方法的返回类型

c - 如何获取通过exec调用的父进程中已执行应用程序的状态?

c - 我需要在这里更新文件描述符吗?

java - 我想使用 spring mvc 通过 zohomail 发送电子邮件 zoho mail 发送电子邮件的此配置是否正确

java - 使用 jQuery (GWT) 进行表单上传

java - 在沙盒中从 PHP 运行 Java 程序

ruby - 在 ruby​​ 循环中运行几个 'exec'

c - fclose 和 close 的区别

python - 使用带有文件描述符的 Python Twisted 的示例