【问题标题】:Error when using linux grep command in java在java中使用linux grep命令时出错
【发布时间】:2018-04-22 08:22:47
【问题描述】:

我正在尝试使用进程构建器在 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

【问题讨论】:

  • 完整命令必须作为单个参数传递给 bash:args[2] = "grep -n -e KERNELVERSION " + kernelFilePath.trim();

标签: java linux bash shell


【解决方案1】:

您无需显式运行/bin/bash 即可执行grep 进程。直接调用它,ProcessBuilder 就会运行它:

String[] args = {"grep", "-n", "KERNELVERSION", kernelFilePath.trim()};

此外,您不需要使用 -e 选项,除非您要搜索多个模式。

如果你真的想在/bin/bash 中运行grep

String[] args = {"/bin/bash", "-c", "grep -n KERNELVERSION " + kernelFilePath.trim()};

将单个参数传递给bash,其中包含要执行的完整命令和参数。

【讨论】:

    【解决方案2】:

    您是否尝试将 args[2] 更改为完整命令?

    另外,你可以使用 pgrep,它不需要你使用管道。

    【讨论】:

    • pgrep 将如何提供帮助?它用于 grepping 正在运行的进程,而不是文件中的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多