【问题标题】:How to save a shell script's echo output within Java [duplicate]如何在Java中保存shell脚本回显输出[重复]
【发布时间】:2012-04-16 14:22:48
【问题描述】:

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

//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 输出?如果没有,是否有用于读取输出的 tail -f 等效项?

【问题讨论】:

标签: java bash shell junit


【解决方案1】:

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

I posted an answer to this exact same question a while ago,这在从外部进程读取时适用于所有情况,这也是为什么不再使用Process.exec() 而使用ProcessBuilder原因

【讨论】:

  • 经过一番摸索和谷歌搜索后,我决定采用这种方法,因为当我需要增加当前功能的复杂性时,它最有意义。感谢您的建议!
【解决方案2】:

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

【讨论】:

  • 我喜欢这个想法,虽然我没有编写 shell 脚本的经验。最好我想在 Java 中解决这个问题,因为我在编写/调试 Java 方面拥有最丰富的经验,但如果这是从 shell 脚本编写者的角度来看的方法,那么我将开始搜索初学者教程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2013-05-18
  • 2018-08-12
  • 2016-07-27
  • 1970-01-01
  • 2016-10-29
相关资源
最近更新 更多