如何从Kotlin代码中调用外部命令?
我想从Kotlin代码中调用外部命令。 在C / Perl中,我会使用system()函数; 在Python中,我会使用subprocess模块; 在Go中,我将使用os / exec; 等等。但是,如何在Kotlin中做到这一点?
通过脱壳来运行git diff的示例:
"git diff".runCommand(gitRepoDir)
下面是runCommand
扩展函数的两个实现:
1.重定向到stdout / stderr
这将来自subprocess的输出连接到常规标准输出和标准错误:
fun String.runCommand(workingDir: File) { ProcessBuilder(*split(" ").toTypedArray()) .directory(workingDir) .redirectOutput(Redirect.INHERIT) .redirectError(Redirect.INHERIT) .start() .waitFor(60, TimeUnit.MINUTES) }
2.以字符串forms捕获输出
重定向到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")
您将需要安全权限来执行命令。