脚本中exec_k8s(get_file()+"/dev-kubeconfig")读不到dev-kubeconfig但exec_k8s(tmpFile.Name())这个可以读到文件为什么

//  defer os.RemoveAll(tmpDir)
package main

import (
  _ "embed"
  "embed"
  "path/filepath"
  "fmt"
  "os"
  "os/exec"
  "io/ioutil"
  "log"
    "strings"
)

//go:embed kubeconfig
var embeddedFileContent string


//go:embed env.info qa-kubeconfig dev-kubeconfig
var configFS embed.FS

func get_file()string {
  // 创建共享临时目录
  tmpDir, err := ioutil.TempDir("", "kubeconfigs_*")
  if err != nil {
    log.Fatal(err)
  }
  defer os.RemoveAll(tmpDir)

  // 处理每个嵌入文件
  files := []string{"env.info", "qa-kubeconfig", "dev-kubeconfig"}
  for _, filename := range files {
    // 读取嵌入内容
    content, err := configFS.ReadFile(filename)
    if err != nil {
      log.Printf("警告: 读取 %s 失败: %v", filename, err)
      continue
    }

    // 创建带原始文件名的临时文件
    tmpPath := filepath.Join(tmpDir, filename)
    if err := ioutil.WriteFile(tmpPath, content, 0600); err != nil {
      log.Printf("警告: 写入 %s 失败: %v", tmpPath, err)
      continue
    }

    log.Printf("已生成: %s", tmpPath)
  }

  log.Printf("所有文件已写入: %s", tmpDir)
    return tmpDir
}



func main() {
  // 方法1:直接使用嵌入内容(无需文件)
  log.Println("嵌入文件内容直接读取:")
  log.Println(embeddedFileContent)

  // 方法2:动态生成临时文件后执行cat
  tmpFile, err := ioutil.TempFile("", "temp_*kubeconfig")
  if err != nil {
    log.Fatal(err)
  }
  defer os.Remove(tmpFile.Name())

  if _, err := tmpFile.WriteString(embeddedFileContent); err != nil {
    log.Fatal(err)
  }
  tmpFile.Close()

    fmt.Println(tmpFile.Name())
    exec_k8s(get_file() + "/dev-kubeconfig")
    exec_k8s(tmpFile.Name())
}

func exec_k8s(file string) {
    cmd := exec.Command("sh", "-c","kubectl get pod --kubeconfig " + file)
    // 执行并捕获输出
    output, err := cmd.CombinedOutput()
    if err != nil {
        fmt.Printf("执行失败: %v\n输出: %s", err, string(output))
        return
    }

    // 处理结果(去除换行符)
    result := strings.TrimSpace(string(output))
    fmt.Println("查询结果:\n", result)
}

问题出在get_file()函数中的defer os.RemoveAll(tmpDir)语句和临时文件的生命周期管理上。具体原因分析如下:

文件删除时机问题
get_file()函数返回临时目录路径后,defer os.RemoveAll(tmpDir)会立即执行删除操作,导致后续exec_k8s()调用时文件已不存在。而tmpFile.Name()对应的文件由于在main()函数中通过defer控制删除时机,能保持到函数结束前有效

解决方案对比
临时文件方式:通过ioutil.TempFile创建的文件由main()函数的defer控制生命周期,在exec_k8s调用时仍存在
临时目录方式:get_file()返回前就触发了defer删除,导致路径失效

修正建议
修改get_file()函数,移除defer并将目录管理权交给调用方
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 8,519评论 0 5
  • 为了让我有一个更快速、更精彩、更辉煌的成长,我将开始这段刻骨铭心的自我蜕变之旅!从今天开始,我将每天坚持阅...
    李薇帆阅读 5,941评论 0 3
  • 似乎最近一直都在路上,每次出来走的时候感受都会很不一样。 1、感恩一直遇到好心人,很幸运。在路上总是...
    时间里的花Lily阅读 5,211评论 0 2
  • 1、expected an indented block 冒号后面是要写上一定的内容的(新手容易遗忘这一点); 缩...
    庵下桃花仙阅读 3,541评论 0 1
  • 一、工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)矩形、椭圆选框工具 【M】移动工具 【V...
    墨雅丫阅读 3,508评论 0 0