当前位置: 首页 > 知识库问答 >
问题:

如何从静态编程语言代码中调用外部命令?

夏昌胤
2023-03-14

我想从静态编程语言代码调用外部命令。

  • 在C/Perl中,我将使用system()函数
  • 在Python中,我将使用子流程模块
  • 在Go中,我将使用os/exec等

但是在科特林我该怎么做呢?

共有3个答案

空夕
2023-03-14

基于@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
申屠瀚海
2023-03-14

如果你在 JVM 上运行,你可以只使用 Java Runtime exec 方法。例如:

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

您需要具有安全权限才能执行命令。

吴西岭
2023-03-14

通过脱壳运行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中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。