java - 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_241
oracle。(我不能使用更高的 java 版本,因为我的项目的依赖项之一需要 java 8)。
解决方案
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"});
推荐阅读
- django-rest-framework - 在序列化程序中获取外键的值
- c# - SQL 不运行字符串命令
- javascript - 在使用转义函数时也使用字符串插值来构建 sql 查询是不好的做法吗?
- html - fancybox 3 卡体点击事件
- android - 如何在 android studio 上使用简单的适配器设置评分栏值
- python - 当 PythonOperator 尝试调用 API 并下载数据时,Airflow DAG 失败
- reactjs - 为我的 CRA 打字稿项目中的几乎每个文件创建“dist”文件夹
- qt - 在当前鼠标坐标处从渐变中获取颜色
- c++ - 如何将一个类型专门化为一个范围?
- python - 使用ray并行化模拟器python