Java ProcessBuilder无法运行简单的脚本

时间:2012-09-11 20:36:06

标签: java linux bash shell processbuilder

我有test.sh调用某个程序,该程序输出一些行。

我的需要是只捕获最后一行输出

所以,如果我做简单的

bash test.sh | tail -n 1  ========> Command 1

然后我收到错误"Do you want output to go to | or to tail"

所以为了解决上述问题,我做了

(bash test.sh) | tail -n 1   =======> Command 2 

然后我得到简单的1行日志。到目前为止一切都很好。

现在我需要通过java程序调用上面的命令,所以我将'('作为第一个参数传递给ProcessBuilder,但它抱怨它不能理解'('作为第一个参数。

如何将Command 2传递给ProcessBuilder以获取最后一行日志。

我对bash和linux不是很熟悉所以请原谅我的无知。我甚至不知道为什么我收到command 1的错误。

4 个答案:

答案 0 :(得分:0)

好吧,既然你现在正在使用Java,你可以使用它的“一次编写一次运行”方面。编写一个打开文件的程序,读取它的行,然后获取最后一行。它适用于任何平台。

一个很好的课程是BuffedReader

答案 1 :(得分:0)

要获取文件中的最后一行 -

$tail -1 filename.dat

快速演示

$ cat filename.dat
Line 1
Line 2
Line 3
Line 4
End Line
$ tail -1 filename.dat
End Line

答案 2 :(得分:0)

Java的ProcessBuilder(以及Runtime.exec方法)不支持管道(|),重定向(>)和运行多个命令({{ 1}})。相反,您应该创建一个单独的脚本来调用您的bash脚本并将其传递给尾部:

&

然后在Java中:

#!/bin/sh
#tailLog.sh
bash test.sh | tail -n 1

请记住,processBuilder.command("tailLog.sh"); 和其他shell令牌特定于 shell ,因此Java无法识别它们。

答案 3 :(得分:0)

你可以在这里做一些重新排序,以使这更容易。

  • 无需使用tail命令,因为在读取ProcessBuilder输出时可以捕获最后一个。
  • 要确保在Java应用程序调用脚本时运行脚本,请确保#!/bin/bash显示为脚本中的第一行。还要确保它是可执行的。

这是一个改编自现有应用程序的代码,它将捕获最后一行。

ProcessBuilder builder = new ProcessBuilder("test.sh");
Process process = builder.start();
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
String lastLine = null;
while ((line = br.readLine()) != null) {
if (line != null) {
   lastLine = line;
}
}

System.out.println(lastLine);