Как вызвать внешнюю команду из кода Котлина?

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