Salida incompleta sobre Java Runtime.getRuntime (). Exec (comando)
Quiero crear una aplicación como la terminal Jenkins:
Y uso Java Runtime.getRuntime().exec(command)para ejecutar el comando, descubro que la salida está incompleta.
textshell.sh:
# textshell.sh
echo "wwwwwww";
sleep 2
ls
Por ejemplo: cuando ejecuto textshell.sh en mi terminal mac sh -x testshell.sh , la salida:
+ echo wwwwwww
wwwwwww
+ sleep 2
+ ls
testshell.sh
pero cuando ejecuto por java Java Runtime.getRuntime().exec("sh -x testshell.sh") , salida:
wwwwwww
testshell.sh
los argumentos de la cáscara -xparecen inútiles
¿Cómo puedo arreglarlo?
Respuestas
Como señala @Joachim Sauer, no está leyendo STDERR, así que pierda las líneas de salida de eco de la set -xsalida. Ajuste su código para acceder process.getErrorStream()también.
Alternativamente, puede cambiar a ProcessBuildersi desea leer el flujo de error combinado con la salida:
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)+'"');