¿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?
- ¿Por qué no puedo poner el {de una class anónima en una nueva línea en Kotlin?
- La label no denota un bucle en paraCada
- Uso de LiveData con data binding
- Propiedad de superclass no inicializada en class Derivada
- Error de configuration de Kotlin
- ¿Cómo usar la anotación Swagger @ApiResponses en Kotlin?
- ¿Cuál es la manera idiomática de Kotlin de adquirir un Logger?
- No puede abrir el proyecto después de actualizar Android Studio
- Actividad de tabs en Kotlin (Android Studio)
- Recolectando artículos con las transmisiones de Kotlin
- Proyecto Gradle: java.lang.NoClassDefFoundError: kotlin / jvm / internal / Intrinsics
- ¿Cómo hacer que Cucumber deje que Spring inyecte classs definitivas en el paso?
- Descargar un file desde un control remoto y savelo en un dispositivo Android
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.