Fullmenu null

 

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.

Comando simple

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

Esperar finalización

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)

}
  1. Definimos la variables donde volcaremos el resultado de nuestro execute.

  2. Ejecutamos el comando.

  3. Obtenemos la salida del comando resultado de su ejecución.

  4. Establecemos un time out a nuestro comando.

  5. En error obtendremos la salida en caso de que falle nuestro comando y en caso de funcionar correctamente nuestro valor se guardará en resultado.

  6. El resultado es correcto podemos continuar.


Script
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)

}