os/exec包用于执行外部命令,示例包括:1. 使用Run()执行无输出命令;2. Output()获取标准输出;3. 分别捕获stdout和stderr;4. 设置Dir和Env控制环境。

在Go语言中,os/exec 包用于执行外部命令。它提供了一种安全且灵活的方式来启动子进程并与其交互。下面是一些常见的使用示例,帮助你理解如何用 os/exec 执行外部命令。
1. 简单执行一个命令(无需输出)
如果你只需要运行一个命令并等待它完成,不关心输出,可以使用 Command 和 Run 方法。
package main
import (
"log"
"os/exec"
)
func main() {
cmd := exec.Command("ls", "-l")
err := cmd.Run()
if err != nil {
log.Fatalf("命令执行失败: %v", err)
}
}
这段代码会执行 ls -l 并等待其完成。如果命令不存在或出错,Run() 会返回错误。
2. 获取命令的输出
使用 Output() 方法可以获取命令的标准输出。
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("echo", "Hello, Go!")
output, err := cmd.Output()
if err != nil {
log.Fatalf("命令执行失败: %v", err)
}
fmt.Printf("输出: %s", output)
}
Output() 自动处理标准输出,并在命令失败时返回错误(包括非零退出码)。
3. 捕获错误输出或同时处理 stdout 和 stderr
如果你想分别处理标准输出和标准错误,可以手动连接管道。
package main
import (
"bytes"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("grep", "foo", "nonexistent_file.txt")
var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
log.Printf("命令出错: %v", err)
}
log.Printf("标准输出: %s", stdout.String())
log.Printf("标准错误: %s", stderr.String())
}
这种方式适合需要区分正常输出和错误信息的场景。
4. 设置命令执行环境和工作目录
你可以自定义命令的环境变量和工作目录。
package main
import (
"log"
"os/exec"
)
func main() {
cmd := exec.Command("pwd")
cmd.Dir = "/tmp" // 设置工作目录
output, err := cmd.Output()
if err != nil {
log.Fatalf("执行失败: %v", err)
}
log.Printf("在 /tmp 下执行 pwd: %s", output)
}
通过设置 Dir 字段指定工作目录,Env 字段可自定义环境变量。
基本上就这些常见用法。os/exec 提供了对进程控制的完整支持,包括超时、输入重定向等,适合大多数外部命令调用需求。










