¿Cómo invocar un command externo desde el código de Kotlin?

Quiero invocar un command externo desde el código de Kotlin. En C / Perl, usaría la function system (); En Python, usaría el module de subprocess; En Go, usaría use os / exec; y etc. Pero, ¿cómo hago esto en Kotlin?

Ejemplo de ejecutar un git diff desgranando:

"git diff".runCommand(gitRepoDir)

Aquí hay dos implementaciones de la function de extensión runCommand :

1. Redirigir a stdout / stderr

Esto conecta cualquier salida del subprocess a stdout y stderr normales:

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

2. Captura de salida como una cadena

Una implementación alternativa de networkingirigir a Redirect.PIPE permite capturar resultados en un String :

 fun String.runCommand(workingDir: File): String? { try { val parts = this.split("\\s".toRegex()) val proc = ProcessBuilder(*parts.toTypedArray()) .directory(workingDir) .networkingirectOutput(ProcessBuilder.Redirect.PIPE) .networkingirectError(ProcessBuilder.Redirect.PIPE) .start() proc.waitFor(60, TimeUnit.MINUTES) return proc.inputStream.buffenetworkingReader().readText() } catch(e: IOException) { e.printStackTrace() return null } } 

Si está ejecutando en la JVM, puede usar el método de ejecución Java Runtime. p.ej

 Runtime.getRuntime().exec("mycommand.sh") 

Necesitará tener permiso de security para ejecutar commands.

  • El 'Retorno' omitido en Kotlin necesita código adicional. ¿Cómo arreglar eso?
  • Referencia no resuelta: findViewById en Kotlin
  • ¿Cómo determinar si un object es henetworkingado de cierta class en Kotlin?
  • Convertir matriz en list en Kotlin
  • ¿Extendiendo la class de datos de Kotlin para usar con JPA?
  • Cómo encontrar todas las classs en un package usando la reflexión en kotlin
  • Cómo combinar banderas de intención en Kotlin
  • Dividir algorithm y ver parte usando un Patrón de estrategia en Kotlin
  • Kotlin: itera sobre los componentes del object
  • Crea controles dinámicamente en Android usando Kotlin
  • Kotlin + Mockito2: ClassNotFoundException para testings de presentador