Неполный вывод о Java Runtime.getRuntime (). Exec (command)

Oct 28 2020

Я хочу создать приложение, подобное терминалу Jenkins:

И я использую Java Runtime.getRuntime().exec(command)для выполнения команды, выясняю, что вывод неполный.

texthell.sh:

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

Например: когда я запускаю файлtexthell.sh в своем Mac-терминале sh -x testshell.sh , выхожу :

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

но когда я выполняю java Java Runtime.getRuntime().exec("sh -x testshell.sh") , вывод:

wwwwwww
testshell.sh

аргументы оболочки -xкажутся бесполезными

Как я могу это исправить?

Ответы

1 DuncG Oct 28 2020 at 13:35

Как указывает @Joachim Sauer, вы не читаете STDERR, поэтому пропустите строки вывода эха из set -xвывода. Измените свой код, чтобы также получить доступ к process.getErrorStream().

В качестве альтернативы вы можете переключиться на, ProcessBuilderесли хотите прочитать поток ошибок, объединенный с выводом:

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