Saída incompleta sobre Java Runtime.getRuntime (). Exec (comando)
Quero construir um aplicativo como o terminal Jenkins:
E eu uso Java Runtime.getRuntime().exec(command)para executar o comando, descubro que a saída está incompleta.
texthell.sh:
# textshell.sh
echo "wwwwwww";
sleep 2
ls
Por exemplo: quando executo texthell.sh no meu terminal mac sh -x testshell.sh , a saída:
+ echo wwwwwww
wwwwwww
+ sleep 2
+ ls
testshell.sh
mas quando eu executo por java Java Runtime.getRuntime().exec("sh -x testshell.sh") , a saída:
wwwwwww
testshell.sh
os args do shell -xparecem inúteis
Como posso corrigir isso?
Respostas
Como @Joachim Sauer aponta, você não está lendo STDERR, então perca as linhas de saída de eco da set -xsaída. Ajuste seu código para acessar process.getErrorStream()também.
Como alternativa, você pode alternar para ProcessBuilderse quiser ler o fluxo de erro mesclado com a saída:
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)+'"');