You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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))
}

关键说明

  1. 伪终端的作用:PTY会模拟真实终端的行为,当向其写入输入内容时,会自动将输入回显到输出流中,和用户直接在终端输入的行为一致。
  2. 换行符的必要性:原myprog中fmt.Scan会等待换行符确认输入完成,因此写入时必须加上\n,否则子进程会一直阻塞等待输入结束。
  3. 依赖安装:需要先安装PTY库:
    go get github.com/creack/pty
    

运行效果

编译myprog.go为可执行文件后,运行testsub.go,会得到预期输出:

Type a number: 33
Incremented: 34

内容的提问来源于stack exchange,提问作者Sreyas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:05:16