如何在Java中保存shell脚本的echo输出

时间:2012-04-16 14:22:48

标签: java bash shell junit

我正在开发一个Java程序,它在JUnit测试中调用几个Shell脚本(因此除了。和E之外没有输出)操作文件和SQL表,然后将所述表中的数据与它们的期望值进行比较。一切都在理论上有效,但是我遇到了一个错误的错误,其中一种类型的测试按预期工作,而另一种类型在十分钟超时后失败。我已将问题隔离为Shell脚本之一,但是我没有编写此脚本,我无法以任何方式更改它。我可以解决此问题的最佳方法是保存相关脚本的输出,该输出来自一系列回显调用。有没有一种简单/可靠的方法来保存回声输出?我已经google了一下,但没有任何结果。我还没有尝试存储输出,所以我没有试图向您展示,但我已经编写的可能相关的代码是:

//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脚本以及保存它们的echo输出吗?如果没有,是否有一个尾部-f等效的读取输出?

2 个答案:

答案 0 :(得分:1)

如何使用写一个新脚本文件,比如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

答案 1 :(得分:1)

为了尽可能轻松地执行此操作,您应该使用Asyncronous读取和写入外部进程的输出。这可能是阻塞并导致超时的原因,就是脚本echo回放内容的方式,并且它们没有被消耗。

I posted an answer to this exact same question a while ago,这适用于从外部流程阅读的所有情况,为什么为什么不再使用Process.exec()并使用ProcessBuilder