Unvollständige Ausgabe über Java Runtime.getRuntime (). Exec (Befehl)

Oct 28 2020

Ich möchte eine App wie Jenkins Terminal erstellen:

Und ich benutze Java Runtime.getRuntime().exec(command), um den Befehl auszuführen, um herauszufinden, dass die Ausgabe unvollständig ist.

textshell.sh:

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

Beispiel: Wenn ich textshell.sh in meinem Mac-Terminal ausführe, wird Folgendes sh -x testshell.sh ausgegeben:

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

aber wenn ich von Java ausführe Java Runtime.getRuntime().exec("sh -x testshell.sh") , Ausgabe:

wwwwwww
testshell.sh

Die Shell-Argumente -xscheinen nutzlos zu sein

Wie kann ich es reparieren?

Antworten

1 DuncG Oct 28 2020 at 13:35

Wie @Joachim Sauer betont, lesen Sie STDERR nicht. Verpassen Sie also die Echolinien, die vom Ausgang set -xausgegeben werden. Passen Sie Ihren Code an, um auch auf den zuzugreifen process.getErrorStream().

Alternativ können Sie zu wechseln, ProcessBuilderwenn Sie den mit der Ausgabe zusammengeführten Fehlerstrom lesen möchten:

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)+'"');