如何在Java中保存shell脚本的回声输出[英] How to save a shell script's echo output within Java

问题描述

我正在研究一个JUnit测试中的几个shell脚本的Java程序(因此没有输出除外.和e's)来操纵文件和SQL表,然后将所述表中的数据与其预期值进行比较.一切都在理论上工作,但是我遇到了一个音乐错误,其中一种类型的测试在预期工作,而另一个类型在十分之次超时后失败.我孤立这个问题是一个shell脚本,但是我没有写这个脚本,我无法以任何方式更改它.我可以解决问题的最佳方式是保存所讨论的脚本的输出,这来自一系列echo调用.保存回声输出有稍微直接/可靠的方法吗?我忘了一点,但没有什么已经出现.我没有尝试存储输出,所以我没有尝试向您展示,但我已经写过的代码可能是相关的:

//Currently using BufferedWriter, File, FileWriter, IOException, and Writer
import java.io.*;

//Method to write to a log file
public void record(String input) throws IOException {
  writer = new BufferedWriter(new FileWriter(file,true));
  writer.write(input + "\n");
  writer.close();
}

Runtime rt = Runtime.getRuntime();

//Several of these since a lot of file manipulation/script running occurs
process = rt.exec("./shell.sh");
process.waitFor();
在另一个问题中,我询问,有人推荐的一些原因不使用runtime.exec().虽然我意识到不使用exec()的优势,但我需要为此版本的程序.

tl; dr问题:我的Java程序可以轻松地运行shell脚本,并保存它们的回声输出吗?如果没有,则有一个相当于读取输出的尾巴 - f次吗?

推荐答案

尽可能无痛地执行此操作,您应该真正使用外部过程的异步读取和写入.这就是可能阻止并导致超时的原因,是脚本是echo它的内容后面的方式,它们不会被消耗.

我发布了一个完全相同的问题的答案,遍布了腹外部进程阅读时的所有情况,是为什么为什么不使用Process.exec()并且使用ProcessBuilder.

其他推荐答案

使用写一个新脚本文件,说scriptWithOutput.sh,将回声重定向到日志文件

#!/bin/sh

log="someDir/someLog.log"

# This saves all you "echoes" to the log file
exec &> $log

# Your shell script
./shell.sh

然后在您的Java代码中

process = rt.exec("./scriptWithOutput.sh");
然后尝试从
java读取someDir/someLog.log?

本文地址:https://www.itbaoku.cn/post/978476.html