如何让代码自动响应命令行交互以完成代码生成测试?
解决代码生成器自动输入"yes"的问题
你之前尝试的exec.Command("yes").Output()或直接操作Stdout的方式无效,核心原因是没把yes的输出关联到代码生成器命令的输入流上。正确的做法是通过标准输入管道主动向生成器命令写入所需输入,具体实现如下:
示例代码(Go语言)
package main import ( "io" "os/exec" ) func main() { // 替换为你的代码生成器命令及对应参数 generatorCmd := exec.Command("your-code-generator", "generate-grpc-client") // 获取生成器命令的标准输入管道 stdin, err := generatorCmd.StdinPipe() if err != nil { panic(err) } // 启动生成器进程(此时命令会进入等待输入的状态) if err := generatorCmd.Start(); err != nil { panic(err) } // 向生成器输入"yes"并添加换行符(模拟终端回车提交输入) _, err = io.WriteString(stdin, "yes\n") if err != nil { panic(err) } stdin.Close() // 关闭输入流,告知生成器输入已完成 // 等待命令执行结束,获取合并的标准输出与错误输出 output, err := generatorCmd.CombinedOutput() if err != nil { panic(err) } println(string(output)) }
关键注意点
- 输入流关联:必须通过
StdinPipe()获取目标命令的输入流,单独运行yes命令只会向当前终端输出,无法关联到生成器进程的输入。 - 启动后再写入:先调用
Start()启动生成器进程,待其进入等待输入状态后,写入的内容才会被正确接收。 - 换行符不可缺:命令行交互通常以回车(即
\n)作为输入提交的标志,写入时必须添加换行符。 - 关闭输入流:写入完成后关闭
stdin,避免生成器一直等待后续输入而无法继续执行。
内容的提问来源于stack exchange,提问作者Alex Rekunch
相关产品推荐
相关产品推荐

