Go跨平台命令执行:自动/手动处理Y/n确认输入的方案问询
Go执行交互式命令的跨平台解决方案
方案一:自动完成确认(自动发送Y+回车)
原代码仅捕获了子命令的标准输出,未处理标准输入,导致子命令等待用户输入时因无数据流入而异常终止。要实现自动确认,需将子命令的Stdin关联到写入管道,并监听输出在合适时机发送确认输入:
package main import ( "bufio" "fmt" "os/exec" "runtime" "strings" ) func getShell() string { if runtime.GOOS == "windows" { return "powershell" } return "bash" } func AutoConfirmCommand(command string) error { cmd := exec.Command(getShell(), "-c", command) // 创建stdin、stdout管道 stdin, err := cmd.StdinPipe() if err != nil { return err } stdout, err := cmd.StdoutPipe() if err != nil { return err } // 启动子命令 if err := cmd.Start(); err != nil { return err } // 异步监听输出,检测到确认提示时发送Y+回车 go func() { scanner := bufio.NewScanner(stdout) for scanner.Scan() { line := scanner.Text() fmt.Println(line) // 匹配确认提示关键词(不区分大小写) if strings.Contains(strings.ToLower(line), "do you want to continue") { _, _ = stdin.Write([]byte("y\n")) stdin.Close() } } }() // 等待命令执行完成 return cmd.Wait() } func main() { if err := AutoConfirmCommand("stencil download"); err != nil { fmt.Printf("命令执行失败: %v\n", err) } }
关键说明:
- 通过
StdinPipe获取子命令的输入管道,在检测到确认提示时写入y\n完成自动确认 - 用goroutine异步监听输出,避免阻塞主流程
- 依赖
getShell函数适配Windows和类Unix系统的shell环境
方案二:允许用户手动输入确认
如果需要让用户直接与子命令交互,只需将子命令的标准输入、输出、错误流直接绑定到当前进程的对应流,用户即可在终端直接输入确认信息:
package main import ( "fmt" "os" "os/exec" "runtime" ) func getShell() string { if runtime.GOOS == "windows" { return "powershell" } return "bash" } func InteractiveCommand(command string) error { cmd := exec.Command(getShell(), "-c", command) // 将子命令的IO与当前进程的标准IO绑定 cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr // 启动并等待命令执行完成 return cmd.Run() } func main() { if err := InteractiveCommand("stencil download"); err != nil { fmt.Printf("命令执行失败: %v\n", err) } }
关键说明:
cmd.Stdin = os.Stdin让子命令直接读取用户的终端输入cmd.Stdout和cmd.Stderr绑定后,子命令的输出会直接打印到终端- 完全跨平台,无需额外处理不同系统的交互逻辑
内容的提问来源于stack exchange,提问作者Isaac Martinez
相关产品推荐
相关产品推荐

