运行 另一个程序,但单独留下 stdout/stderr
Running another program but leaving stdout/stderr alone
我需要从一个 Java 程序到 运行 另一个程序(一个普通的命令行可执行文件),等待它完成,检查退出代码。这可以很容易地完成:
static void run(String[] cmd) throws IOException, InterruptedException {
var more = false;
for (var s : cmd) {
if (more) System.out.print(' ');
more = true;
System.out.print(s);
}
System.out.println();
var builder = new ProcessBuilder(cmd);
var process = builder.start();
process.waitFor();
var e = process.exitValue();
if (e != 0) {
System.out.println("process exit value: " + e);
System.exit(e);
}
}
但是,stdout/stderr 从该程序进入位桶。有没有办法改变一些事情,使 stdout/stderr 正常显示在控制台上,就像从 shell 脚本调用程序时那样?
我不是寻找如何捕获stdout/stderr。我知道该怎么做;它涉及一些比较混乱的多线程代码,以及在将结果输出转储到控制台之前的延迟。相反,我希望有一种简单的方法可以告诉相关机器只让 stdout/stderr 像往常一样单独输出到控制台。
您可以对 stdout 使用 redirectOutput
,对 stderr 使用类似的调用 redirectError
:
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
builder.redirectError(ProcessBuilder.Redirect.INHERIT);
因为 @Abra points out, the inheritIO()
方法方便了这两个调用以及标准输入等价物。
我需要从一个 Java 程序到 运行 另一个程序(一个普通的命令行可执行文件),等待它完成,检查退出代码。这可以很容易地完成:
static void run(String[] cmd) throws IOException, InterruptedException {
var more = false;
for (var s : cmd) {
if (more) System.out.print(' ');
more = true;
System.out.print(s);
}
System.out.println();
var builder = new ProcessBuilder(cmd);
var process = builder.start();
process.waitFor();
var e = process.exitValue();
if (e != 0) {
System.out.println("process exit value: " + e);
System.exit(e);
}
}
但是,stdout/stderr 从该程序进入位桶。有没有办法改变一些事情,使 stdout/stderr 正常显示在控制台上,就像从 shell 脚本调用程序时那样?
我不是寻找如何捕获stdout/stderr。我知道该怎么做;它涉及一些比较混乱的多线程代码,以及在将结果输出转储到控制台之前的延迟。相反,我希望有一种简单的方法可以告诉相关机器只让 stdout/stderr 像往常一样单独输出到控制台。
您可以对 stdout 使用 redirectOutput
,对 stderr 使用类似的调用 redirectError
:
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
builder.redirectError(ProcessBuilder.Redirect.INHERIT);
因为 @Abra points out, the inheritIO()
方法方便了这两个调用以及标准输入等价物。