exec - ejemplo - ¿Cómo invocar un comando externo desde el código Kotlin?
ejecutar varios comandos cmd desde java (4)
Quiero invocar un comando externo desde el código Kotlin. En C / Perl, usaría la función system (); En Python, usaría el módulo de subproceso; En Go, usaría use os / exec; y etc. Pero, ¿cómo hago esto en Kotlin?
Basado en la respuesta de @jkschneider pero un poco más de Kotlin-ified:
fun String.runCommand(workingDir: File = File("."),
timeoutAmount: Long = 60,
timeoutUnit: TimeUnit = TimeUnit.SECONDS): String? {
return try {
ProcessBuilder(*this.split("//s".toRegex()).toTypedArray())
.directory(workingDir)
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE)
.start().apply {
waitFor(timeoutAmount, timeoutUnit)
}.inputStream.bufferedReader().readText()
} catch (e: IOException) {
e.printStackTrace()
null
}
}
Ejemplo de ejecutar un git diff mediante el desmonte:
"git diff".runCommand(gitRepoDir)
Aquí hay dos implementaciones de la función de extensión runCommand
:
1. Redirigir a stdout / stderr
Esto conecta cualquier salida del subproceso a stdout y stderr regulares:
fun String.runCommand(workingDir: File) {
ProcessBuilder(*split(" ").toTypedArray())
.directory(workingDir)
.redirectOutput(Redirect.INHERIT)
.redirectError(Redirect.INHERIT)
.start()
.waitFor(60, TimeUnit.MINUTES)
}
2. Capturando la salida como una cadena
Una implementación alternativa que redirige a Redirect.PIPE
lugar le permite capturar resultados en una 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
}
}
Para Kotlin Native:
platform.posix.system("git status")
Para JVM
Runtime.getRuntime().exec("git status")
Si está ejecutando en la JVM, puede usar el método exec
Java Runtime. p.ej
Runtime.getRuntime().exec("mycommand.sh")
Necesitará tener permiso de seguridad para ejecutar comandos.