![](/img/trans.png)
[英]Java ProcessBuilder not able to run Python script in Java
[英]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无法识别它们。
您可以在此处进行一些重新排序,以使其更容易。
#!/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.