如何从Kotlin代码中调用外部命令?

我想从Kotlin代码中调用外部命令。 在C / Perl中,我会使用system()函数; 在Python中,我会使用subprocess模块; 在Go中,我将使用os / exec; 等等。但是,如何在Kotlin中做到这一点?

2 Solutions collect form web for “如何从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") 

您将需要安全权限来执行命令。

  • 为什么需要代码B在输入参数中使用SQLiteDatabase。()?
  • 转换Android项目与数据绑定从Java到Kotlin
  • 什么是伴侣对象,为什么我们需要它?
  • 如何传递次kotlin构造函数variables?
  • Kotlin从2个数组中过滤最大值的方法?
  • Kotlin以声明作为expression
  • 在Kotlin中为JavaFX项目生成jar
  • 在Kotlin注释参数中使用一个java常量
  • 不能用Gradle和Kotlin运行生成的JAR文件
  • 私人可视性修改器和子包
  • 在kotlin中itemclicklistener如何使用大视图显示滑行图像
  • Kotlin language will be the best programming language for Android.