首页 > 解决方案 > Java:将命令行程序输出重定向到 /dev/null 时没有这样的文件或目录

问题描述

我目前正在使用 java 调用 bash 程序。bash 程序输出的消息太多,我想将它们重定向到/dev/null. 但是我遇到了一个奇怪的错误No such file or directory

这是我的演示。

public static void main(String[] args) {
        try {
            // Another version I've tried:
            // Process p = Runtime.getRuntime().exec("echo a > /dev/null");
            ProcessBuilder b = new ProcessBuilder("echo a");
            // b.redirectOutput(new File("/dev/null")).redirectErrorStream(true);
            b.redirectOutput(ProcessBuilder.Redirect.to(new File("/dev/null")))
                    .redirectErrorStream(true);
            Process p = b.start();
            p.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
}

错误信息如下:

java.io.IOException: Cannot run program "echo a": error=2, No such file or directory
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
    at test.main(test.java:12)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:340)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:271)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
    ... 2 more

我正在使用MacBook与 Catalina 一起使用的,并且我尝试过java 1.8.0_231来自1.8.0_241oracle。(我不能使用更高的 java 版本,因为我的项目的依赖项之一需要 java 8)。

标签: java

解决方案


ProcessBuilder.Redirect.DISCARD要忽略进程的输出,使用它比显式重定向到特殊文件/设备(例如 /dev/null )更容易且更便携。

        b.redirectOutput(ProcessBuilder.Redirect.DISCARD)
         .redirectErrorStream(true);

忘记使用Runtime.exec- 该方法设计糟糕且难以安全使用。如果您想使用该"> /dev/null"样式进行输入重定向,您需要记住这>是一个由命令解释器外壳创建的结构,而不是操作系统,如果您想使用它,您必须运行一个外壳。

Runtime.getRuntime().exec(new String[] {"sh", "-c", "echo a > /dev/null"});

推荐阅读