Java Runtime.getRuntime (). Exec (komut) hakkında eksik çıktı

Oct 28 2020

Jenkins terminali gibi bir uygulama oluşturmak istiyorum:

Ve Runtime.getRuntime().exec(command)komutu yürütmek için Java kullanıyorum , çıktının eksik olduğunu görüyorum .

textshell.sh:

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

Örneğin: Mac terminalimde textshell.sh komutunu çalıştırdığımda sh -x testshell.sh çıktı:

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

ama java ile çalıştırdığımda Java Runtime.getRuntime().exec("sh -x testshell.sh") çıktı:

wwwwwww
testshell.sh

kabuk argümanları -xişe yaramaz görünüyor

Nasıl düzeltebilirim?

Yanıtlar

1 DuncG Oct 28 2020 at 13:35

@ Joachim Sauer'in belirttiği gibi, STDERR okumuyorsunuz, bu yüzden çıktıdan yankı çıktısı satırlarını kaçırın set -x. Erişmek için kodunuzu ayarlayın process.getErrorStream().

Alternatif ProcessBuilderolarak, çıkışla birleştirilmiş hata akışını okumak istiyorsanız öğesine geçebilirsiniz :

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