亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 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 關注
  • 239 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號