Groovy ajoute la execute
méthode pour String
rendre l'exécution des shells assez facile;
println "ls".execute().text
mais si une erreur se produit, il n'y a pas de sortie résultante. Existe-t-il un moyen facile d'obtenir à la fois l'erreur standard et la norme? (autre que de créer un tas de code pour; créer deux threads pour lire les deux flux d'entrée, puis utiliser un flux parent pour attendre qu'ils se terminent, puis reconvertir les chaînes en texte?)
Ce serait bien d'avoir quelque chose comme;
def x = shellDo("ls /tmp/NoFile")
println "out: ${x.out} err:${x.err}"
Réponses:
Ok, je l'ai résolu moi-même;
affiche:
out> err> ls: cannot access /badDir: No such file or directory
la source
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()
renvoie unProcess
objet, c'est pourquoi"ls".execute().text
fonctionne. Vous devriez pouvoir simplement lire le flux d'erreurs pour déterminer s'il y a eu des erreurs.Il existe une méthode supplémentaire sur
Process
qui vous permettent de passer unStringBuffer
pour récupérer le texte:consumeProcessErrorStream(StringBuffer error)
.Exemple:
la source
la source
runCommand("echo HELLO WORLD")
Je trouve cela plus idiomatique:
Comme le mentionne un autre article, il s'agit d'appels bloquants, mais puisque nous voulons travailler avec la sortie, cela peut être nécessaire.
la source
Pour ajouter une autre information importante aux réponses fournies ci-dessus -
Pour un processus
essayez toujours d'utiliser
plutôt que
pour capturer les sorties après avoir exécuté des commandes en groovy car ce dernier est un appel bloquant ( question SO pour raison ).
la source
la source
mais si la commande échoue, le processus se terminera
la source
sh
vient-il?sh
fait partie de la DSL groovy de Jenkins. Probablement pas utile ici