
本文介绍如何使用 Go 的 os/exec 包直接捕获外部命令的 stdout 输出并转为字符串,避免文件 I/O 和手动管道处理,简洁高效地获取命令执行结果。
本文介绍如何使用 go 的 `os/exec` 包直接捕获外部命令的 stdout 输出并转为字符串,避免文件 i/o 和手动管道处理,简洁高效地获取命令执行结果。
在 Go 中,若需运行外部命令(如 ls -lh)并将其标准输出(stdout)保存为内存中的字符串,无需手动创建管道、启动 goroutine 或使用 io.Copy——exec.Cmd 提供了更简洁、安全且符合惯用法的内置方法:Cmd.Output()。
该方法会自动启动命令、等待其完成,并返回标准输出内容([]byte 类型)及可能的错误。之后只需通过类型转换 string(out) 即可获得可读字符串:
package main
import (
"fmt"
"os/exec"
)
func main() {
// 执行命令并捕获 stdout
out, err := exec.Command("ls", "-lh").Output()
if err != nil {
fmt.Printf("命令执行失败: %v\n", err)
return
}
// 转换为字符串(注意:Output() 不包含 stderr)
result := string(out)
fmt.Println("命令输出:")
fmt.Print(result)
}
✅ 关键优势:
-
Output()自动调用cmd.Run()(即阻塞等待命令结束),无需手动Start()+Wait(); - 内部已配置
cmd.Stdout为内存缓冲区,无需显式StdoutPipe(); - 若命令返回非零退出码,
err将为*exec.ExitError类型,可通过err.(*exec.ExitError).ExitCode()获取退出码; -
注意:
Output()仅捕获 stdout,stderr 会被丢弃(若需同时捕获 stderr,请改用Cmd.CombinedOutput())。
⚠️ 注意事项:
- 命令输出过大时,
Output()会一次性加载全部内容到内存,不适用于 GB 级输出;此时应考虑StdoutPipe()配合流式处理; - 确保命令路径正确(推荐使用绝对路径或确保
PATH环境变量可用); - 在生产环境中,建议对用户输入的参数做严格校验,防止命令注入。
总结:优先使用 exec.Command(...).Output() 是 Go 中捕获命令 stdout 到字符串的最简、最可靠方式——代码更少、逻辑更清晰、错误处理更统一。










