Groovy dodaje execute
metodę String
do, aby wykonywanie powłok było dość łatwe;
println "ls".execute().text
ale jeśli wystąpi błąd, nie ma wynikowego wyniku. Czy istnieje łatwy sposób na uzyskanie zarówno błędu standardowego, jak i standardowego? (inne niż tworzenie zestawu kodu; utworzyć dwa wątki w celu odczytania obu strumieni wejściowych, a następnie użyć strumienia nadrzędnego, aby poczekać na ich zakończenie, a następnie przekonwertować ciągi z powrotem na tekst?)
Byłoby miło mieć coś takiego;
def x = shellDo("ls /tmp/NoFile")
println "out: ${x.out} err:${x.err}"
Odpowiedzi:
Ok, rozwiązałem to sam;
wyświetlacze:
out> err> ls: cannot access /badDir: No such file or directory
źródło
envVars = ["P4PORT=p4server:2222", "P4USER=user", "P4PASSWD=pass", "P4CLIENT=p4workspace"]; workDir = new File("path"); cmd = "bash -c \"p4 change -o 1234\""; proc = cmd.execute(envVars, workDir);
"ls".execute()
zwracaProcess
obiekt, dlatego"ls".execute().text
działa. Powinieneś być w stanie po prostu przeczytać strumień błędów, aby określić, czy wystąpiły jakieś błędy.Jest to dodatkowy sposób na
Process
które pozwalają przejśćStringBuffer
do pobierania tekst:consumeProcessErrorStream(StringBuffer error)
.Przykład:
źródło
źródło
runCommand("echo HELLO WORLD")
Uważam to za bardziej idiomatyczne:
Jak wspomina inny post, są to połączenia blokujące, ale ponieważ chcemy pracować z wyjściem, może to być konieczne.
źródło
Aby dodać jeszcze jedną ważną informację do powyższych odpowiedzi -
Na proces
zawsze staraj się użyć
zamiast
przechwytywanie wyjść po wykonaniu poleceń w groovy, ponieważ to drugie jest wywołaniem blokującym ( pytanie SO z powodu ).
źródło
źródło
ale jeśli polecenie nie powiedzie się, proces zostanie zakończony
źródło
sh
bierze?sh
jest częścią groovy DSL Jenkins. Prawdopodobnie nie przydatne tutaj