O Groovy adiciona o execute
método String
para facilitar a execução de shells;
println "ls".execute().text
mas se ocorrer um erro, não haverá saída resultante. Existe uma maneira fácil de obter o erro padrão e o padrão? (além de criar um monte de código para; criar dois encadeamentos para ler os dois fluxos de entrada e, em seguida, usar um fluxo pai para esperar que eles sejam concluídos e converter as seqüências novamente em texto?)
Seria bom ter algo parecido;
def x = shellDo("ls /tmp/NoFile")
println "out: ${x.out} err:${x.err}"
Respostas:
Ok, eu mesmo resolvi;
exibe:
out> err> ls: cannot access /badDir: No such file or directory
fonte
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()
retorna umProcess
objeto e é por isso que"ls".execute().text
funciona. Você deve conseguir apenas ler o fluxo de erros para determinar se houve algum erro.Existe um método extra em
Process
que lhe permitem passar umStringBuffer
para recuperar o texto:consumeProcessErrorStream(StringBuffer error)
.Exemplo:
fonte
fonte
runCommand("echo HELLO WORLD")
Acho isso mais idiomático:
Como outro post menciona, essas chamadas estão bloqueando, mas como queremos trabalhar com a saída, isso pode ser necessário.
fonte
Para adicionar mais uma informação importante às respostas fornecidas acima -
Para um processo
sempre tente usar
ao invés de
capturar as saídas após a execução de comandos no groovy, pois a última é uma chamada de bloqueio ( questão SO por motivo ).
fonte
fonte
mas se a falha do comando, o processo será encerrado
fonte
sh
vem?sh
faz parte do groovy DSL de Jenkins. Provavelmente não é útil aqui