java - 如何使管道与 Runtime.exec() 一起工作?

标签 java exec runtime.exec

考虑以下代码:

String commandf = "ls /etc | grep release";

try {

    // Execute the command and wait for it to complete
    Process child = Runtime.getRuntime().exec(commandf);
    child.waitFor();

    // Print the first 16 bytes of its output
    InputStream i = child.getInputStream();
    byte[] b = new byte[16];
    i.read(b, 0, b.length); 
    System.out.println(new String(b));

} catch (IOException e) {
    e.printStackTrace();
    System.exit(-1);
}

程序的输出是:

/etc:
adduser.co

当然,当我从 shell 运行时,它会按预期工作:

poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release

互联网告诉我,由于管道行为不是跨平台的,在 Java 工厂生产 Java 的聪明才智无法保证管道正常工作。

我该怎么做?

我不会使用 Java 结构而不是 grepsed 进行所有解析,因为如果我想更改语言,我将被迫用那种语言重写我的解析代码,这是完全不行的。

如何让 Java 在调用 shell 命令时进行管道和重定向?

最佳答案

编写一个脚本,并执行该脚本而不是单独的命令。

管道是外壳的一部分,所以你也可以这样做:

String[] cmd = {
"/bin/sh",
"-c",
"ls /etc | grep release"
};

Process p = Runtime.getRuntime().exec(cmd);

关于java - 如何使管道与 Runtime.exec() 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5928225/

相关文章:

java - 在 Java 中获取并存储子进程的输出

c - 有没有办法在不终止其他线程的情况下生成新进程?

php - 如何使用带有 exec 的 avconv 和 php 显示流的屏幕截图?

java - 在外部应用程序完全运行时获取通知 - Java

java - 如何启动第二个 Java 进程?

java - 如何从 java 控制台运行控制台应用程序?

JavaFX 相对于 Swing setFocusable(true/false)?

java - Spring Cloud - 配置客户端缓存属性

java - 我可以通过线程在方法中执行特定的代码块吗

java - 为什么 Runtime.getRuntime().exec 在 Tomcat 中以 root 身份 fork 进程?