Groovy fügt die execute
Methode hinzu String
, um das Ausführen von Shells ziemlich einfach zu machen.
println "ls".execute().text
Wenn jedoch ein Fehler auftritt, wird keine Ausgabe ausgegeben. Gibt es eine einfache Möglichkeit, sowohl den Standardfehler als auch den Standard zu ermitteln? (außer eine Menge Code zu erstellen; zwei Threads erstellen, um beide Eingabestreams zu lesen, und dann einen übergeordneten Stream verwenden, um darauf zu warten, dass sie abgeschlossen sind, und dann die Zeichenfolgen wieder in Text konvertieren?)
Es wäre schön, so etwas zu haben;
def x = shellDo("ls /tmp/NoFile")
println "out: ${x.out} err:${x.err}"
Antworten:
Ok, habe es selbst gelöst;
zeigt an:
out> err> ls: cannot access /badDir: No such file or directory
quelle
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()
Gibt einProcess
Objekt zurück, weshalb es"ls".execute().text
funktioniert. Sie sollten in der Lage sein, nur den Fehlerstrom zu lesen, um festzustellen, ob Fehler aufgetreten sind.Es gibt eine zusätzliche Methode
Process
, mit der Sie eine übergeben könnenStringBuffer
, um den Text abzurufen :consumeProcessErrorStream(StringBuffer error)
.Beispiel:
quelle
quelle
runCommand("echo HELLO WORLD")
Ich finde das idiomatischer:
Wie in einem anderen Beitrag erwähnt, blockieren diese Anrufe, aber da wir mit der Ausgabe arbeiten möchten, kann dies erforderlich sein.
quelle
Um eine weitere wichtige Information zu den oben angegebenen Antworten hinzuzufügen -
Für einen Prozess
versuche immer zu benutzen
eher, als
Das Erfassen der Ausgänge nach dem Ausführen von Befehlen in Groovy, da letzterer ein blockierender Aufruf ist ( SO-Frage aus gutem Grund ).
quelle
quelle
Wenn der Befehl fehlschlägt, wird der Prozess beendet
quelle
sh
das?sh
ist Teil des Jenkins groovigen DSL. Wahrscheinlich nicht nützlich hier