How to invoke external command from within Kotlin code?

后端 未结 7 1426
花落未央
花落未央 2020-11-29 22:08

I want to invoke an external command from Kotlin code. In C/Perl, I would use system() function. In Python, I would use the subprocess module. In Go, I would us

7条回答
  •  死守一世寂寞
    2020-11-29 22:46

    Example of running a git diff by shelling out:

    "git diff".runCommand(gitRepoDir)

    Here are two implementations of the runCommand extension function:

    1. Redirect to stdout/stderr

    This wires any output from the subprocess to regular stdout and stderr:

    fun String.runCommand(workingDir: File) {
        ProcessBuilder(*split(" ").toTypedArray())
                    .directory(workingDir)
                    .redirectOutput(Redirect.INHERIT)
                    .redirectError(Redirect.INHERIT)
                    .start()
                    .waitFor(60, TimeUnit.MINUTES)
    }
    

    2. Capturing output as a String

    An alternative implementation redirecting to Redirect.PIPE instead allows you to capture output in a 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
        }
    }
    

提交回复
热议问题