我正在尝试使用流程构建器在java中获取grep linux shell命令的输出。但我在这种情况下陷入了困境。请帮我。 感谢您的建议!
String[] args = new String[7];
args[0] = "/bin/bash";
args[1] = "-c";
args[2] = "grep";
args[3] = "-n";
args[4] = "-e";
args[5] = "KERNELVERSION";
args[6] = kernelFilePath.trim();
ProcessBuilder pb;
Process process = null;
try {
pb = new ProcessBuilder(args);
pb = pb.directory(new File(directory));
pb.inheritIO();
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
process = pb.start();
process.waitFor();
} catch (IOException | InterruptedException e) {
System.out.println("executeCmdWithOutput() exception : " + e.toString());
} finally {
if (process != null) {
process.destroy();
}
}
==>错误:
用法:grep [OPTION] ... PATTERN [FILE] ...
尝试'grep --help'获取更多信息。
我在bash中尝试了这个命令并且运行正常:
grep -n -e KERNELVERSION ..../Makefile
答案 0 :(得分:2)
您是否尝试将args [2]更改为完整命令?
此外,您可以使用pgrep,它不需要您使用管道。
答案 1 :(得分:0)
您无需显式运行/bin/bash
即可执行grep
进程。只需直接调用它,ProcessBuilder
就会运行它:
String[] args = {"grep", "-n", "KERNELVERSION", kernelFilePath.trim()};
此外,您不需要使用-e
选项,除非您要搜索多个模式。
如果您真的想在grep
中运行/bin/bash
:
String[] args = {"/bin/bash", "-c", "grep -n KERNELVERSION " + kernelFilePath.trim()};
将单个参数传递给bash
,其中包含要执行的完整命令和参数。