Terminal Kotlin本机执行命令并获取输出

Terminal Kotlin本机执行命令并获取输出,terminal,posix,kotlin-native,Terminal,Posix,Kotlin Native,我想知道kotlin native是否有办法通过posix调用命令并接收其终端输出。例如,我想让“git diff”命令工作,而不必创建临时文件,将输出写入其中,然后从该文件读取 在SO上,我只找到了需要ProcessBuilder的解决方案,这在kotlin native上是不可用的,因为它是一个Java库。我找到了一段我想要使用的工作代码,所以我将它发布在这里供未来的观众观看 fun executeCommand(命令:String):String{ val fp:CPointer?=pop

我想知道kotlin native是否有办法通过posix调用命令并接收其终端输出。例如,我想让“git diff”命令工作,而不必创建临时文件,将输出写入其中,然后从该文件读取


在SO上,我只找到了需要ProcessBuilder的解决方案,这在kotlin native上是不可用的,因为它是一个Java库。

我找到了一段我想要使用的工作代码,所以我将它发布在这里供未来的观众观看

fun executeCommand(命令:String):String{
val fp:CPointer?=popen(命令“r”)
val缓冲区=字节数组(4096)
val returnString=StringBuilder()
/*打开命令进行读取*/
如果(fp==NULL){
printf(“无法运行命令\n”)
出口(1)
}
/*一次读取一行输出-输出它*/
变量扫描=fgets(buffer.refTo(0),buffer.size,fp)
如果(扫描!=null){
while(扫描!=NULL){
returnString.append(扫描!!.toKString())
扫描=fgets(buffer.refTo(0),buffer.size,fp)
}
}
/*接近*/
pclose(fp)
return returnString.trim().toString()
}

这是Kotlin Native发布的exec命令的改进版本,它使用命令stderr引发异常,而不是仅返回
exit(1)
(这本身并不总是理想的行为),trim现在也是可选的

导入kotlinx.cinterop*
导入platform.posix*
有趣的执行命令(
命令:String,
trim:Boolean=true,
重定向stderr:Boolean=true
):字符串{
val commandToExecute=if(重定向stderr)“$command 2>&1”else命令
val fp=popen(commandToExecute,“r”)?:错误(“未能运行命令:$command”)
val stdout=buildString{
val缓冲区=字节数组(4096)
while(true){
val input=fgets(buffer.refTo(0),buffer.size,fp)?:中断
追加(input.toKString())
}
}
val状态=pclose(fp)
如果(状态!=0){
错误(“命令`$Command`失败,状态为$status${if(redirectStderr)”:$stdout“else”“}”)
}
返回if(trim)stdout.trim()else stdout
}

我用上面的答案创建了一个运行任意本地进程/命令的gradle kotlin native/jvm多平台多项目:

以下是我的结果:

导入kotlinx.cinterop.refTo
导入kotlinx.cinterop.toKString
导入platform.posix.fgets
导入platform.posix.pclose
导入platform.posix.popen
实际对象MppProcess:IMPProcess{
实际覆盖fun executeCommand(
命令:String,
重定向stderr:Boolean
):字符串{
val commandToExecute=if(重定向stderr)“$command 2>&1”else命令
val fp=popen(commandToExecute,“r”)?:错误(“未能运行命令:$command”)
val stdout=buildString{
val缓冲区=字节数组(4096)
while(true){
val input=fgets(buffer.refTo(0),buffer.size,fp)?:中断
追加(input.toKString())
}
}
val状态=pclose(fp)
如果(状态!=0){
错误(“命令`$Command`失败,状态为$status${if(redirectStderr)”:$stdout“else”“}”)
}
返回标准输出
}
}
关于jvm

import java.util.concurrent.TimeUnit
实际对象MppProcess:IMPProcess{
实际覆盖fun executeCommand(
命令:String,
重定向stderr:Boolean
):字符串{
回程截流{

ProcessBuilder(command.split(Regex)(?这在windows上不起作用:(有提示吗?这在windows上不起作用。)(有提示吗?