2025-08-15 使用exec.Run执行带参数命令时遇到的EOF问题及解决方案 使用exec.Run执行带参数命令时遇到的EOF问题及解决方案 一、问题现象:神秘的EOF错误最近在开发一个用Go编写的自动化部署工具时,遇到了一个奇怪的问题:当通过exec.Command执行docker exec命令时,程序频繁返回EOF错误。具体场景如下:go cmd := exec.Command("docker", "exec", "-i", "container_name", "bash") input := bytes.NewBufferString("echo hello") cmd.Stdin = input output, err := cmd.CombinedOutput() // 此处报错 EOF表面上看代码逻辑没有问题——我们创建了一个带输入的命令,然后捕获输出。但实际运行时,子进程会立即收到EOF信号并退出。二、问题根源分析通过深入调试和查阅文档,发现根本原因在于管道通信的时序问题: 标准输入管道的生命周期:当父进程(Go程序)关闭输入管道时,子进程(bash)会立即收到EOF 缓冲区传递机制:bytes.Buffer内容被全部读取后,Go会主动关闭管道 Shell的交互特性:bash在非交互模式下一收到EOF就... 2025年08月15日 17 阅读 0 评论