Я хочу вызвать внешнюю команду из кода Котлина. В C/Perl я бы использовал функцию system(); В Python я бы использовал модуль подпроцесса; В Go, я бы использовал использование os/exec; и т.д. Но как мне это сделать в Котлине?
Как вызвать внешнюю команду из кода Котлина?
Ответ 1
Пример запуска git diff путем обхода:
"git diff".runCommand(gitRepoDir)
Вот две реализации runCommand
расширения runCommand
:
1. Перенаправление на stdout/stderr
Это выводит любой выход из подпроцесса на стандартный stdout и stderr:
fun String.runCommand(workingDir: File) {
ProcessBuilder(*split(" ").toTypedArray())
.directory(workingDir)
.redirectOutput(Redirect.INHERIT)
.redirectError(Redirect.INHERIT)
.start()
.waitFor(60, TimeUnit.MINUTES)
}
2. Захват вывода в виде строки
Альтернативная реализация, перенаправляющая на Redirect.PIPE
вместо этого позволяет вам записывать выходные данные в 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
}
}
Ответ 2
Если вы работаете на JVM, вы можете просто использовать метод Java Runtime exec
. например
Runtime.getRuntime().exec("mycommand.sh")
Для выполнения команд вам потребуется разрешение на безопасность.
Ответ 3
Для Kotlin Native:
platform.posix.system("git status")
Для JVM
Runtime.getRuntime().exec("git status")