Je travaille actuellement sur l' appel programme bash en utilisant java. La sortie du programme bash de message trop et je veux les rediriger vers /dev/null
. Mais je rencontré une erreur bizarre No such file or directory
.
Voici ma démo.
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();
}
}
Et le message d'erreur suivant comme:
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
J'utilise un MacBook
avec Catalina, et j'ai essayé java 1.8.0_231
et 1.8.0_241
d'Oracle. (Je ne pouvais pas utiliser la version java plus parce que l' un de la dépendance de mon projet nécessite java 8).
Pour ignorer la sortie du processus, il est plus facile et plus portable à utiliser ProcessBuilder.Redirect.DISCARD
que de rediriger explicitement un fichier / dispositif spécial tel que / dev / null.
b.redirectOutput(ProcessBuilder.Redirect.DISCARD)
.redirectErrorStream(true);
Oubliez l' utilisation Runtime.exec
- cette méthode est mal conçu et difficile à utiliser en toute sécurité. Si vous voulez faire la redirection d'entrée avec le "> /dev/null"
style, vous devez vous rappeler que >
est une construction créée par le shell interpréteur de commandes, pas le système d'exploitation, et si vous voulez l'utiliser , vous devez exécuter un shell.
Runtime.getRuntime().exec(new String[] {"sh", "-c", "echo a > /dev/null"});