Groovy agrega el executemétodo para Stringhacer que la ejecución de shells sea bastante fácil;
println "ls".execute().text
pero si ocurre un error, entonces no hay salida resultante. ¿Hay una manera fácil de obtener tanto el error estándar como el estándar? (¿aparte de crear un montón de código para crear dos hilos para leer ambos flujos de entrada, luego usar un flujo principal para esperar a que se completen y luego convertir las cadenas de nuevo en texto?)
Sería bueno tener algo así;
def x = shellDo("ls /tmp/NoFile")
println "out: ${x.out} err:${x.err}"

Respuestas:
Ok, lo resolví yo mismo;
muestra:
out> err> ls: cannot access /badDir: No such file or directoryfuente
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()devuelve unProcessobjeto por lo que"ls".execute().textfunciona. Debería poder simplemente leer la secuencia de errores para determinar si hubo algún error.Existe un método adicional en
Processque permiten pasar de unaStringBuffera recuperar el texto:consumeProcessErrorStream(StringBuffer error).Ejemplo:
fuente
fuente
runCommand("echo HELLO WORLD")Esto me parece más idiomático:
Como menciona otra publicación, estas son llamadas de bloqueo, pero dado que queremos trabajar con la salida, esto puede ser necesario.
fuente
Para agregar una información más importante a las respuestas proporcionadas anteriormente:
Para un proceso
siempre trata de usar
más bien que
para capturar las salidas después de ejecutar comandos en groovy ya que esta última es una llamada de bloqueo ( pregunta SO por razón ).
fuente
fuente
pero si el comando falla, el proceso terminará
fuente
shvieneshes parte del maravilloso DSL de Jenkins. Probablemente no sea útil aquí