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

如何使用golang os\exec包,操控一个交互试命令程序?

谭吉星
2023-10-19
首先下面代码是有问题,大佬看一下代码,这个输入这里应该有问题,或者这个库不支持这样的持续交互吗?
package mainimport (    "fmt"    "io"    "os/exec"    "time")func main() {    // 进行字符串的替换,把小写字母替换成大写字母    cmd := exec.Command("tr", "a-z", "A-Z")    var (        err    error        stdout io.ReadCloser        stdin  io.WriteCloser    )    stdout, err = cmd.StdoutPipe()    if err != nil {        panic(err)    }    stdin, err = cmd.StdinPipe()    if err != nil {        panic(err)    }    if err = cmd.Start(); err != nil {        panic(err)    }    // 这里协程给tr命令输入标准输入的 小写 abc 字符串    go func() {        for {            time.Sleep(time.Second)            stdin.Write([]byte("abc"))        }    }()    // 然后这里从标准输出读到上面输入后tr命令转换后的大写字符串 ABC,但这里没有读到,不知道为什么    for {        data := make([]byte, 512)        n, err := stdout.Read(data)        fmt.Println(string(data[:n]), err)    }}

共有2个答案

司寇阳曦
2023-10-19

你如果是想写交互式命令行工具的话,我推荐一个包给你
github.com/AlecAivazis/survey/v2
参考文章你可以看这个
https://blog.csdn.net/zhanggqianglovec/article/details/127986871
image.png
这篇文章应该能帮助到你

呼延河
2023-10-19

这段代码的问题在于,stdoutstdin 的类型是 io.ReadCloserio.WriteCloser,但是 StdoutPipe()StdinPipe() 返回的管道类型实际上是 io.Readerio.Writer。因此,我们需要将 stdoutstdin 的类型更改为 io.Readerio.Writer

以下是修改后的代码:

package mainimport ( "fmt" "io" "os/exec" "time")func main() { // 进行字符串的替换,把小写字母替换成大写字母 cmd := exec.Command("tr", "a-z", "A-Z") var ( err    error stdout io.ReadCloser stdin  io.WriteCloser ) stdout, err = cmd.StdoutPipe() if err != nil { panic(err) } stdin, err = cmd.StdinPipe() if err != nil { panic(err) } // 这里协程给tr命令输入标准输入的 小写 abc 字符串 go func() { for { time.Sleep(time.Second) stdin.Write([]byte("abc")) } }() // 然后这里从标准输出读到上面输入后tr命令转换后的大写字符串 ABC for { data := make([]byte, 512) n, err := stdout.Read(data) if err != nil { fmt.Println(err) break } fmt.Println(string(data[:n])) }}

在这个修改后的代码中,我们将 stdoutstdin 的类型更改为 io.Readerio.Writer,然后从 stdout 中读取转换后的大写字符串。现在应该可以正常读取到输出结果了。

 类似资料:
  • 我需要用docker exec运行2个命令。我正在从docker容器中复制一个文件,不想处理凭据来使用像ssh这样的东西。此命令复制一个文件: 但它会创建一个子目录var/log,我想避免这种情况,所以如果我可以在docker容器中执行这些操作,我应该很好: 如何让docker exec运行2个命令?

  • 问题内容: 我对通过Python调用控制交互式CLI应用程序感兴趣。 我想在最基本的层次上,我需要一个Python脚本,它将在主机操作系统上启动CLI应用程序。将任何内容从标准输入传送到CLI应用程序,然后将任何输出从CLI应用程序传送到标准输出。 从这个基础上,对输入和输出进行一些处理应该非常简单。 老实说,我可能只需要一个关于该技术被称为的指针。我不知道我要寻找什么。 问题答案: PExpec

  • MOAC母链客户端使用了和以太坊类似的交互式命令行。用户可以在命令行(console)中执行内置的JAVA script命令或者利用脚本(script),输出结果显示在命令行中。 这里使用的chain3对象,是MOAC参考以太坊,而开发的一套javascript库,目的是让应用程序能够与MOAC的VNODE和SCS节点进行通信。注意,这里有两层,moac启动了一个MOAC VNODE节点,cons

  • 我注册了一个SlashCommand。。。但它的回答是“交互应用程序的命令无效”,有人能帮忙吗。。。

  • 我正在使用discord.js和WOKCommands来使用斜杠命令,但是当在discord中输入时,它给我一个错误“无效的交互应用程序命令” 下面是该命令的代码: 仅当我也需要显示主脚本的代码时,该命令的代码才是命令的代码。我会这样做的。

  • 从v1.1.1开始,应用链客户端SCS也支持使用了和以太坊类似的交互式命令行。用户可以在命令行(console)中执行内置的JAVA script命令或者利用脚本(script),输出结果显示在命令行中。 这里使用的chain3对象,是MOAC参考以太坊,而开发的一套javascript库,目的是让应用程序能够与MOAC的VNODE和SCS节点进行通信。注意,这里有两层,moac启动了一个MOAC