Sortie incomplète sur Java Runtime.getRuntime (). Exec (commande)

Oct 28 2020

Je veux créer une application comme le terminal Jenkins:

Et j'utilise Java Runtime.getRuntime().exec(command)pour exécuter la commande, découvrez que la sortie est incomplète.

texthell.sh:

# textshell.sh
echo "wwwwwww";
sleep 2
ls

Par exemple: lorsque j'exécute texteshell.sh dans mon terminal mac sh -x testshell.sh , affichez :

+ echo wwwwwww
wwwwwww
+ sleep 2
+ ls
testshell.sh

mais quand j'exécute par java Java Runtime.getRuntime().exec("sh -x testshell.sh") , sortie:

wwwwwww
testshell.sh

le shell args -xsemble inutile

Comment puis-je y remédier?

Réponses

1 DuncG Oct 28 2020 at 13:35

Comme @Joachim Sauer le souligne, vous ne lisez pas STDERR, alors manquez les lignes de sortie d'écho de la set -xsortie. Ajustez votre code pour accéder process.getErrorStream()également au.

Vous pouvez également basculer vers ProcessBuildersi vous souhaitez lire le flux d'erreur fusionné avec la sortie:

String[]cmd = new String[]{"sh", "-x", "testshell.sh"}
ProcessBuilder pb = new ProcessBuilder(cmd);

// THIS MERGES STDERR>STDOUT:
pb.redirectErrorStream(true);

// EITHER send all output to a file here:
Path stdout = Path.of("mergedio.txt");
pb.redirectOutput(stdout.toFile());

Process p = pb.start();

// OR consume your STDOUT p.getInputStream() here as before:

int rc = p.waitFor();

System.out.println("STDOUT: \""+Files.readString(stdout)+'"');