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

Я хочу вызвать внешнюю команду из кода Котлина. В C / Perl я бы использовал функцию system (); В Python я бы использовал модуль подпроцесса; В Go, я бы использовал использование os / exec; и т. д. Но как мне это сделать в Котлине?

    Пример запуска 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 } } 

    Если вы работаете на JVM, вы можете просто использовать метод Java Runtime exec . например

     Runtime.getRuntime().exec("mycommand.sh") 

    Для выполнения команд вам потребуется разрешение на безопасность.

    Intereting Posts
    Ячейки RecyclerView деформируются при открытии клавиатуры Имея проблемы с записью в EditText в Котлине error: Parceler: невозможно найти генератор чтения / записи для типа io.realm.RealmList Можно ли избежать повторения кода, когда объект должен вернуть измененную копию самого себя? Как написать пользовательский getter, если свойства класса определены в конструкторе? Доступность собственности в Котлине Как сопроводители реализуются в JVM-языках без поддержки JVM? Упрощение добавления и замены фрагментов в Котлине Как я могу добавить данные к объекту Kotlin и получить его на странице Vuejs как запустить скомпилированный файл класса в Котлине? Ошибка: выполнение выполнено для задачи ': app: compileDebugKotlinAfterJava' Как прикрепить элемент HTML или DocumentFragment к DOM? Статический импорт методов Kotlin Companion? Котлин: Нужно ли защищать класс данных Котлина? Являются ли типы данных Kotlin построены на примитивных или не примитивных типах данных Java?