为了账号安全,请及时绑定邮箱和手机立即绑定

从 exec.Command 写入文件

从 exec.Command 写入文件

Go
aluckdog 2023-07-04 17:10:35
我正在尝试将 bash 命令中的文件写入 Go 中的文件中。请注意,这里使用 Go 而不是 bash 有几个原因:我有一些更多的逻辑,例如解析配置文件,我想并行运行多个数据库的代码,最后执行一些更复杂的数据操作。    dumpStr := fmt.Sprintf("pg_dump -U %s -h %s %s | gzip", DbUserName, DbHost, DbName)    cmd := exec.Command("bash", "-c", dumpStr)    cmd.Env = append(cmd.Env, "PGPASSWORD="+DbPassword)    outfile, err := os.Create(DbName + ".gz")    if err != nil {        panic(err)    }    outfile = cmd.Stdout    defer outfile.Close()    err = cmd.Start()    if err != nil {        panic(err)    }    cmd.Wait()但是,我得到的结果是空的。如果我dumpStr从 CLI 执行而不是从该代码执行,我会获取数据...我缺少什么?
查看完整描述

2 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

你没有捕获 的输出pg_dump。您可以使用 Go 来做到这一点,也可以使用pg_dump-s --file。它还可以压缩,--compress因此无需通过管道传输到gzip. 这样就不需要 bash 并且可以避免 shell 引用问题。


cmd := exec.Command(

    "pg_dump",

    "--compress=9",

    "--file="+DbName + ".gz",

    "-U"+DbUserName,

    "-h"+DbHost,

    DbName,

)


log.Print("Running pg_dump...")


if err := cmd.Run(); err != nil {

    log.Fatal(err)

}

更简单、更安全。


为了便于说明,这里介绍了如何在 Go 中完成这一切。

由于Cmd.Stdoutio.Reader 是一个 io.Reader ,cmd.Stdout因此将打开的文件分配给并cmd直接写入它会更简单。

// Same as above, but no --file.

cmd := exec.Command(

    "pg_dump",

    "--compress=9",

    "-U"+DbUserName,

    "-h"+DbHost,

    DbName,

)


// Open the output file

outfile, err := os.Create(DbName + ".gz")

if err != nil {

    log.Fatal(err)

}

defer outfile.Close()


// Send stdout to the outfile. cmd.Stdout will take any io.Writer.

cmd.Stdout = outfile


// Start the command

if err = cmd.Start(); err != nil {

    log.Fatal(err)

}


log.Print("Waiting for command to finish...")


// Wait for the command to finish.

if err = cmd.Wait(); err != nil {

    log.Fatal(err)

}

此外,您只检查命令是否启动,而不检查命令是否成功运行。

来自 的文档Cmd.Start

Start 启动指定的命令,但不等待它完成。

命令退出后,Wait 方法将返回退出代码并释放相关资源。

您正在检查cmd.Start错误,但不是cmd.Wait。检查错误cmd.Start仅意味着命令已启动。如果程序运行时出现错误,您将不知道错误是什么。


查看完整回答
反对 回复 2023-07-04
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

您需要实际使用命令的输出。你没有那样做。为此,请使用该StdoutPipe方法,然后您可以将程序中的标准输出复制到您的文件中。



查看完整回答
反对 回复 2023-07-04
  • 2 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信