Groovy agrega el execute
método para String
hacer 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 directory
fuente
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 unProcess
objeto por lo que"ls".execute().text
funciona. Debería poder simplemente leer la secuencia de errores para determinar si hubo algún error.Existe un método adicional en
Process
que permiten pasar de unaStringBuffer
a 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
sh
vienesh
es parte del maravilloso DSL de Jenkins. Probablemente no sea útil aquí