繁体   English   中英

Java ProcessBuilder无法运行简单的脚本

[英]Java ProcessBuilder cant run simple script

我有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时出错。

好吧,由于您现在正在使用Java,因此可以使用它的“编写一次到处运行”。 编写一个程序来打开文件,读取文件的行,并获取最后一个。 它适用于任何平台。

BuffedReader是一个很好的类。

要获取文件中的最后一行,请使用-

$tail -1 filename.dat

快速演示

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

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

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

然后在Java中:

processBuilder.command("tailLog.sh");

记住| 和其他Shell令牌专用于该Shell ,因此Java无法识别它们。

您可以在此处进行一些重新排序,以使其更容易。

  • 无需使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM