Tomahawkd:
私は現在、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
カタリナで、そして私が試したjava 1.8.0_231
し、1.8.0_241
オラクルから。(私のプロジェクトの依存関係の一つは、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"});