基于@jkschneider的回答,但更具Kotlin化:
fun String.runCommand(
workingDir: File = File("."),
timeoutAmount: Long = 60,
timeoutUnit: TimeUnit = TimeUnit.SECONDS
): String? = runCatching {
ProcessBuilder("\\s".toRegex().split(this))
.directory(workingDir)
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE)
.start().also { it.waitFor(timeoutAmount, timeoutUnit) }
.inputStream.bufferedReader().readText()
}.onFailure { it.printStackTrace() }.getOrNull()
更新:如果您在Gradle Groovy到Kotlin DSL的迁移中,您所需要的只是这一点,您应该关心的代码更少,并且比上述代码可能具有的意外结果(例如,引用参数)更少,
import org.codehaus.groovy.runtime.ProcessGroovyMethods
ProcessGroovyMethods.getText(ProcessGroovyMethods.execute("ls"))
// Or,
fun String.execute() = ProcessGroovyMethods.execute(this)
val Process.text: String? get() = ProcessGroovyMethods.getText(this)
// then just like groovy, "ls".execute().text
如果你在 JVM 上运行,你可以只使用 Java Runtime exec
方法。例如:
Runtime.getRuntime().exec("mycommand.sh")
您需要具有安全权限才能执行命令。
通过脱壳运行git diff的示例:
“git diff”。运行命令(gitRepoDir)
以下是runCommand
扩展函数的两种实现:
这将子流程的任何输出连接到常规的stdout和stderr:
fun String.runCommand(workingDir: File) {
ProcessBuilder(*split(" ").toTypedArray())
.directory(workingDir)
.redirectOutput(Redirect.INHERIT)
.redirectError(Redirect.INHERIT)
.start()
.waitFor(60, TimeUnit.MINUTES)
}
另一种实现是重定向到<code>重定向。管道相反,允许您在<code>字符串
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
}
}
抱歉,我在谷歌搜索中找不到答案...在kotlin中运行bash命令的语法是什么?我想做一个curl命令。那里的留档似乎非常有限,或者我不擅长谷歌搜索?
动机: 在我们的Android项目中,我们有许多验证,比如
我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?
所以我希望我的应用程序在一定的时间间隔内执行操作。在做了一点研究后,我在stackoverflow上找到了一些答案,它使我找到了这个链接,该链接称为固定RateTimer:这是该页面中的第一个示例 当我添加这段代码时,我得到了一个错误。 “表达式'fixedRateTimer'不能作为函数调用。找不到函数'invoke()'变量'fixedRateTimer'必须初始化” 我做了更多的研究并引进了
静态编程语言是否支持已命名的regex组? 命名的regex组看起来像这样:
如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。