如何在Go子进程中实现标准输入与输出提示的同步显示?
实现子进程输入回显的解决方案
可行,要实现输入内容的回显,核心是让子进程认为自己运行在终端环境中,而非通过管道交互。默认的StdinPipe只是单纯的管道,不会触发终端的输入回显行为,因此需要用**伪终端(PTY)**来模拟真实终端的交互逻辑。
修改后的testsub.go代码
package main import ( "fmt" "io" "os/exec" "github.com/creack/pty" ) func main() { cmd := exec.Command("./myprog") // 创建伪终端 tty, err := pty.Start(cmd) if err != nil { panic(err) } defer tty.Close() // 异步写入输入到伪终端,注意加换行符模拟用户回车 go func() { _, err := io.WriteString(tty, "33\n") if err != nil { panic(err) } }() // 读取伪终端的输出 output, err := io.ReadAll(tty) if err != nil { panic(err) } fmt.Print(string(output)) }
关键说明
- 伪终端的作用:PTY会模拟真实终端的行为,当向其写入输入内容时,会自动将输入回显到输出流中,和用户直接在终端输入的行为一致。
- 换行符的必要性:原
myprog中fmt.Scan会等待换行符确认输入完成,因此写入时必须加上\n,否则子进程会一直阻塞等待输入结束。 - 依赖安装:需要先安装PTY库:
go get github.com/creack/pty
运行效果
编译myprog.go为可执行文件后,运行testsub.go,会得到预期输出:
Type a number: 33 Incremented: 34
内容的提问来源于stack exchange,提问作者Sreyas
相关产品推荐
相关产品推荐

