Chamando outros processos do Groovy

Chamando outros processos do Groovy

Existem muitos cenários em que chamar outro processo do Groovy é útil. Por exemplo, você pode querer usar um utilitário de sistema comum que faz o que você deseja com mais facilidade do que faria em seu código Groovy. Ou talvez você precise chamar um programa sofisticado existente, escrito em outra linguagem, que manipulará algumas funcionalidades com mais eficiência. Ou você está sob pressão de prazos e simplesmente não tem tempo para reescrever aquele antigo script Perl. A seguir, uma introdução à chamada de processos externos do Groovy.

Um exemplo simples freqüentemente fornecido para demonstrar a chamada de outro processo do Groovy usa o utilitário ls.

"ls -l".execute()

Para ver os resultados, imprima o texto do fluxo de saída do processo.

println "ls -l".execute().text

Isso retorna uma lista de diretórios em um sistema operacional Unix ou semelhante ao Unix.

Um passo adiante: execute um script personalizado

E se você precisar executar um script personalizado? Groovy deve saber onde encontrá-lo. Isso pode ser alcançado de duas maneiras.

Opção 1: use o caminho absoluto para o seu script

Para este exemplo, suponha que você colocou um script perl na pasta foo do seu diretório pessoal. Use o caminho absoluto completo para construir uma string de comando.

def scriptPath = "/Users/me/foo/example.pl"
def command = "perl -w $scriptPath"
println command
.execute().text

Opção 2: Maior controle do contexto

Outra assinatura do método execute permite passar um array de parâmetros de ambiente e o diretório pai do comando.

def parentDir = "/Users/me/foo"
def command = "perl -w example.pl"
def env = [] // in this case, environment is empty

println command
.execute( env, dir ).text

Você pode construir um ambiente personalizado, adicionando uma propriedade por vez. Ou passe todas as variáveis ​​de ambiente de todo o sistema, da seguinte maneira. Tive a necessidade de fazer isso quando o código que chama o script perl era um executável java em vez de um script groovy em execução no meu terminal.

def env = System.getenv().collect { k, v -> "$k=$v" }

Consumindo a Saída do Processo

Existem maneiras melhores de lidar com a saída do que no primeiro exemplo dado acima. O que o método execute () realmente retorna é um objeto Process. O GDK fornece um método útil consumeProcessOutput (). Aqui está um exemplo:

Process process = command.execute()
def out = new StringBuffer()
def err = new StringBuffer()
process
.consumeProcessOutput( out, err )
process
.waitFor()
if( out.size() > 0 ) println out
if( err.size() > 0 ) println err

Mais sobre processos externos no Groovy

Este artigo não tentou cobrir todas as outras maneiras de chamar processos do Groovy. Alguns deles são:

Meus scripts de exemplo de processos groovy estão disponíveis no Github.