
本文详解如何在 Go 中通过 os/exec 包执行 echo 命令,并将带引号的字符串(如 "foo 0x50")准确写入文件,避免因 shell 重定向语法误用导致文件未生成的问题。
本文详解如何在 go 中通过 `os/exec` 包执行 `echo` 命令,并将带引号的字符串(如 `"foo 0x50"`)准确写入文件,避免因 shell 重定向语法误用导致文件未生成的问题。
在 Go 中使用 exec.Command 执行外部命令时,不能直接将 shell 重定向操作符(如 >)作为参数传入——因为 exec.Command 默认不经过 shell 解析,而是直接调用可执行程序,> 会被当作 echo 的字面参数而非重定向指令,因此 test.txt 不会创建,也不会写入内容。
正确的做法是:由 Go 程序自行管理标准输出(Stdout)的重定向。以下是推荐的完整实现:
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
// 构建命令:仅传递 echo 的实际参数(引号需保留为字符串的一部分)
cmd := exec.Command("echo", `"foo 0x50"`)
// 创建目标文件(注意:os.Create 会截断已有文件)
file, err := os.Create("test.txt")
if err != nil {
fmt.Printf("创建文件失败: %v\n", err)
return
}
defer file.Close() // 确保文件句柄及时释放
// 将命令的标准输出重定向到该文件
cmd.Stdout = file
// 启动并等待命令完成(必须调用 Start + Wait,或直接使用 Run)
if err := cmd.Run(); err != nil {
fmt.Printf("命令执行失败: %v\n", err)
return
}
fmt.Println("成功写入 test.txt:内容为 \"foo 0x50\"")
}✅ 关键要点说明:
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
-
exec.Command("echo","foo 0x50")中的双引号是 Go 字符串字面量的一部分,最终传递给echo的参数即为带引号的字符串;若需输出不含外层引号的foo 0x50,应改为exec.Command("echo", "foo 0x50")。 -
cmd.Stdout = file是核心步骤——它让echo的输出直接写入文件,而非打印到终端。 - 使用
cmd.Run()(等价于Start()+Wait())更简洁安全;若需异步控制,再拆分为Start()/Wait()。 - ❌ 错误写法示例:
exec.Command("echo","foo 0x50", ">", "test.txt")—— 此时echo会尝试打印三个参数:"foo 0x50"、>和test.txt,而非执行重定向。
? 补充建议:
- 若需追加写入(而非覆盖),请改用
os.OpenFile("test.txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)。 - 对于复杂 shell 行为(如管道、多命令组合),可显式调用
/bin/sh -c,但会牺牲可移植性与安全性,非必要不推荐。
运行上述代码后,当前目录下将生成 test.txt,其内容严格为:
"foo 0x50"
(含外层英文双引号,与预期完全一致)

















