在 android 中执行管道命令

Execute pipe command in android

我正在执行一条命令,以便将日志消息写入 SD 卡上的文件中。这已经在工作:

String command = "logcat -f /storage/sdcard1/test.log";
Process logcatProcess = Runtime.getRuntime().exec(command);

现在我想在将其写入文件之前通过 grep 过滤日志输出:

String[] command = {
        "/system/bin/sh",
        "-c",
        "logcat | grep -i Test01 >> /storage/sdcard1/test.log"
    };
Process logcatProcess = Runtime.getRuntime().exec(command);

当我 运行 上面的代码创建文件但没有内容。 grep 命令肯定安装在系统上。这里有什么问题?

logcat 正在向 grep 实时输出,但 grep 正在大批量处理数据。最终,如果有足够的输出,grep 应该写出一些东西。

(如果您正在写入终端而不是文件,grep 的效率会稍低,并且会在它看到的每一行之后刷新,使其感觉更具交互性。这不是特定于 Android 的 grep;您也会在 Linux 或 OS X 上看到此行为。)

如果您使用 logcat -d,它将终止而不是轮询更多日志,并且 grep 也会写出并终止。如果这不是您想要的行为,您可能最终需要使用 ProcessBuilder 来包装 logcat 并在 Java 应用程序中重新实现 grep(无缓冲)。