Java: Aucun fichier ou répertoire lors de la redirection de sortie du programme de ligne de commande / dev / null

Tomahawkd:

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 MacBookavec Catalina, et j'ai essayé java 1.8.0_231et 1.8.0_241d'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).

Joni:

Pour ignorer la sortie du processus, il est plus facile et plus portable à utiliser ProcessBuilder.Redirect.DISCARDque 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"});

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=394695&siteId=1
conseillé
Classement