191 votes

Groovy exécution de l'interpréteur de commandes

Groovy ajoute l' execute méthode de String pour rendre l'exécution de coquilles assez facile;

println "ls".execute().text

mais si une erreur se produit, alors il n'y a pas de résultat. Est-il un moyen facile d'obtenir à la fois l'erreur standard et standard? (autres que la création d'un tas de code; créer deux threads de lire les deux inputstreams, puis à l'aide d'un parent flux d'attendre pour eux de remplir puis de convertir les chaînes retour au texte?)

Il serait agréable d'avoir quelque chose comme;

 def x = shellDo("ls /tmp/NoFile")
 println "out: ${x.out} err:${x.err}"

242voto

Bob Herrmann Points 1653

Ok, résolu en moi-même;

def sout = new StringBuffer(), serr = new StringBuffer()
def proc = 'ls /badDir'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"

affiche:

out> err> ls: impossible d'accéder à /badDir: Aucun fichier ou répertoire

55voto

Joshua Points 8315

"ls".execute() renvoie un objet de Processus qui est pourquoi "ls".execute().le texte fonctionne. Vous devriez être en mesure de lire le flux d'erreur pour déterminer s'il y avait des erreurs.

Il y a une méthode supplémentaire sur le Processus qui permet de passer un StringBuffer pour récupérer le texte: consumeProcessErrorStream(StringBuffer d'erreur).

Exemple:

def proc = "ls".execute()
def b = new StringBuffer()
proc.consumeProcessErrorStream(b)

println proc.text
println b.toString()

34voto

mholm815 Points 500
// a wrapper closure around executing a string                                  
// can take either a string or a list of strings (for arguments with spaces)    
// prints all output, complains and halts on error                              
def runCommand = { strList ->
  assert ( strList instanceof String ||
           ( strList instanceof List && strList.each{ it instanceof String } ) \
)
  def proc = strList.execute()
  proc.in.eachLine { line -> println line }
  proc.out.close()
  proc.waitFor()

  print "[INFO] ( "
  if(strList instanceof List) {
    strList.each { print "${it} " }
  } else {
    print strList
  }
  println " )"

  if (proc.exitValue()) {
    println "gave the following error: "
    println "[ERROR] ${proc.getErrorStream()}"
  }
  assert !proc.exitValue()
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X