Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to invoke external command from within Kotlin code?

Tags:

kotlin

exec

I want to invoke an external command from Kotlin code.

  • In C/Perl, I would use the system() function.
  • In Python, I would use the subprocess module.
  • In Go, I would use os/exec, and etc.

But how do I do this in Kotlin?

like image 557
Big Tummy Avatar asked Feb 16 '16 00:02

Big Tummy


1 Answers

Example of running a git diff by shelling out:

"git diff".runCommand(gitRepoDir)

Here are two implementations of the runCommand extension function:

1. Redirect to stdout/stderr

This wires any output from the subprocess to regular stdout and stderr:

fun String.runCommand(workingDir: File) {     ProcessBuilder(*split(" ").toTypedArray())                 .directory(workingDir)                 .redirectOutput(Redirect.INHERIT)                 .redirectError(Redirect.INHERIT)                 .start()                 .waitFor(60, TimeUnit.MINUTES) } 

2. Capturing output as a String

An alternative implementation redirecting to Redirect.PIPE instead allows you to capture output in a String:

fun String.runCommand(workingDir: File): String? {     try {         val parts = this.split("\\s".toRegex())         val proc = ProcessBuilder(*parts.toTypedArray())                 .directory(workingDir)                 .redirectOutput(ProcessBuilder.Redirect.PIPE)                 .redirectError(ProcessBuilder.Redirect.PIPE)                 .start()          proc.waitFor(60, TimeUnit.MINUTES)         return proc.inputStream.bufferedReader().readText()     } catch(e: IOException) {         e.printStackTrace()         return null     } } 
like image 51
Jonathan Schneider Avatar answered Oct 11 '22 18:10

Jonathan Schneider