如何保存shell脚本';Java中的回音输出

如何保存shell脚本';Java中的回音输出,java,bash,shell,junit,Java,Bash,Shell,Junit,我正在开发一个Java程序,该程序在JUnit测试中调用几个Shell脚本(因此除了.s和E之外没有输出),这些脚本操作文件和SQL表,然后将所述表中的数据与其预期值进行比较。理论上一切正常,但是我遇到了一个strage bug,其中一种测试按预期工作,而另一种测试在10分钟超时后失败。我已经隔离了一个Shell脚本的问题,但是我没有编写这个脚本,我无法以任何方式更改它。解决此问题的最佳方法是保存问题脚本的输出,它来自一系列echo调用。是否有某种简单/可靠的方法来保存回波输出?我在谷歌上搜索了

我正在开发一个Java程序,该程序在JUnit测试中调用几个Shell脚本(因此除了.s和E之外没有输出),这些脚本操作文件和SQL表,然后将所述表中的数据与其预期值进行比较。理论上一切正常,但是我遇到了一个strage bug,其中一种测试按预期工作,而另一种测试在10分钟超时后失败。我已经隔离了一个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;问:我的Java程序可以轻松地运行shell脚本并保存它们的回音输出吗?如果没有,是否有用于读取输出的tail-f等价物?

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

要尽可能轻松地执行此操作,您应该真正使用异步读取和写入外部进程的输出。这可能是阻塞和导致超时的原因,是脚本
echo
将其内容返回的方式,并且它们没有被使用


,这在从外部进程读取时适用于所有情况,这就是为什么不再使用
Process.exec()
和使用
ProcessBuilder

的原因,我想这是一个类似的问题:您可以使用Commons-exec。例如,我喜欢这个想法,尽管我没有编写shell脚本的经验。最好我想在Java中解决这个问题,因为我在编写/调试Java方面最有经验,但是,如果从shell脚本编写者的角度来看这是一种方法,那么我将开始用谷歌搜索初学者教程。经过一番努力和一点谷歌搜索之后,我决定使用这种方法,因为当我需要增加当前功能的复杂性时,它将最有意义。谢谢你的建议!