String resultado = "ls -lt ".execute().text println resultado.toUpperCase()
Descargar el script ../scripts/basico/CommandLocal.groovy
31 August 2017
Es muy común en el día a día que tengamos que ejecutar comandos de shell de forma repetida y en función de la respuesta
del mismo optar por realizar acciones, como por ejemplo ejecutar un comando u otro, etc. Estos comandos van desde un
simple listado de ficheros ( dir
), copiar ficheros ( cp
, copy
) a otros más elaborados.
Así mismo numerosas veces debemos ejecutar esos comandos de forma repetida (una vez por cada directorio, por cada fichero, etc) e incluso condicional (si la invocación de este comando ha ido bien realizar estas acciones y si no estas otras). Para ello solemos recurrir a ficheros por lotes ( .bat en Windows, .sh en Linux ) donde podemos tratar los problemas comentados anteriormente.
En este entorno, Groovy nos ofrece poder ejecutar comandos con la ayuda del método .execute()
de la clase String
y tratar la salida de este como si fuera una cadena, utilizando toda la potencia del lenguaje.
Supongamos que en un sistema *NIX quisieramos realizar un listado de los ficheros de un directorio y mostrar la salida en mayúsculas. Nuestro script sería:
String resultado = "ls -lt ".execute().text println resultado.toUpperCase()
Como podemos observar, simplemente tenemos que construir un String con el comando y llamar a su método execute()
Este método nos devuelve un objeto que entro otras cosas nos ofrece la salida del comando como una cadena mediante la
property text que podemos asignar a una variable
Si lo que necesitamos es lanzar un comando y esperar a que termine para lanzar de nuevo otro comando u otra acción se puede realizar de la siguiente manera:
def resultado = new StringBuilder() //(1)
def error = new StringBuilder()
def comando = "ls -lt".execute() //(2)
comando.consumeProcessOutput(resultado, error) //(3)
comando.waitForOrKill(1000) //(4)
if (!error.toString().equals("")) //(5)
println "Error al ejecutar el comando"
else{
println "Ejecutado correctamente"
println resultado //(6)
}
Definimos la variables donde volcaremos el resultado de nuestro execute
.
Ejecutamos el comando.
Obtenemos la salida del comando resultado de su ejecución.
Establecemos un time out a nuestro comando.
En error
obtendremos la salida en caso de que falle nuestro comando y en caso de funcionar correctamente nuestro
valor se guardará en resultado.
El resultado es correcto podemos continuar.
def resultado = new StringBuilder() //(1)
def error = new StringBuilder()
def comando = "ls -lt".execute() //(2)
comando.consumeProcessOutput(resultado, error) //(3)
comando.waitForOrKill(1000) //(4)
if (!error.toString().equals("")) //(5)
println "Error al ejecutar el comando"
else{
println "Ejecutado correctamente"
println resultado //(6)
}