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

如何将临时文件作为命令行参数传递?执行命令遇文件未找到错误

问题分析与解决方案

这个问题我之前踩过同款坑!你遇到的错误核心原因是错误使用了exec.Command的调用方式。

为什么会报错?

当你把命令和参数拼成一个字符串CLI_CMD + " " + xmlFile.Name()传给exec.Command时,Go会把这个完整字符串当作要执行的程序路径去查找——也就是它会尝试找一个名为/home/go/src/hello/abc.sh /tmp/10.166.30.47.xml187906126的文件,这显然不是你要运行的脚本,自然会报“no such file or directory”。

exec.Command的正确用法是:第一个参数是要执行的程序(这里就是你的abc.sh),后面的参数需要单独作为后续参数传递,而不是拼接成一个字符串。

修正后的代码

package main

import (
    "io/ioutil"
    "os/exec"
    "log"
    "os"
)

func main() {
    CLI_CMD := "/home/go/src/hello/abc.sh"
    hostIP := "10.166.30.47" // 假设你的hostIP值为这个
    xmlFile, err := ioutil.TempFile("", hostIP)
    // 必须检查临时文件创建的错误,避免后续无意义操作
    if err != nil {
        log.Fatalf("创建临时文件失败: %v", err)
    }
    // 用完临时文件后自动删除,避免磁盘残留临时文件
    defer os.Remove(xmlFile.Name())

    // 关键修正:把脚本路径和参数分开传递给exec.Command
    cmd := exec.Command(CLI_CMD, xmlFile.Name())
    stdout, err := cmd.Output()
    if err != nil {
        log.Fatalf("执行命令失败: %v", err)
    }
    // 处理命令输出
    log.Printf("命令输出内容: %s", stdout)
}

额外注意事项

  • 确保你的abc.sh有可执行权限,如果没有,先执行chmod +x /home/go/src/hello/abc.sh
  • 永远不要忽略ioutil.TempFile和cmd.Output()返回的错误,这些错误能帮你快速定位问题
  • 用defer os.Remove(xmlFile.Name())确保临时文件在程序退出时被清理,避免临时文件堆积占用磁盘空间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:21:00