Я хочу вызвать внешнюю команду из кода Котлина. В 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")