Output tidak lengkap tentang Java Runtime.getRuntime (). Exec (command)

Oct 28 2020

Saya ingin membangun aplikasi seperti terminal Jenkins:

Dan saya menggunakan Java Runtime.getRuntime().exec(command)untuk menjalankan perintah tersebut, mengetahui bahwa outputnya tidak lengkap.

textshell.sh:

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

Misalnya: Ketika saya menjalankan textshell.sh di terminal mac saya sh -x testshell.sh , output:

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

tetapi ketika saya mengeksekusi dengan java Java Runtime.getRuntime().exec("sh -x testshell.sh") , output:

wwwwwww
testshell.sh

cangkang itu -xsepertinya tidak berguna

Bagaimana cara memperbaikinya?

Jawaban

1 DuncG Oct 28 2020 at 13:35

Seperti yang ditunjukkan oleh @Joachim Sauer Anda tidak membaca STDERR jadi lewatkan baris keluaran gema dari set -xkeluaran. Sesuaikan kode Anda untuk mengakses process.getErrorStream()juga.

Atau Anda dapat beralih ke ProcessBuilderjika ingin membaca aliran kesalahan yang digabungkan dengan output:

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