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

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

Go exec.Command 似乎無法將信息通過管道傳輸或附加到 .txt 文件。我的語法錯誤嗎?

Go exec.Command 似乎無法將信息通過管道傳輸或附加到 .txt 文件。我的語法錯誤嗎?

Go
慕標5832272 2023-07-31 15:51:01
我一直在嘗試運行一個命令,以便不必使用 bash 腳本,而是使用 go 來運行命令。HOME=/home/gogopowerrangers 在 ubuntu 18.04 上const systemInfoLoc string = "$HOME/systemvar.txt"//I've tried to run with full path as well heregetSystemKernel := exec.Command("uname", "-s", ">>", "home/username/system.txt")getSystemKernel.Run()//^doesn't seem to return anything//orgetsystemvar,_ = exec.Command("echo", "$USER", ">", "$HOME/systemvar.txt").Outputfmt.Println(string(getsystemvar))//here even after the system doesn't seen to recognize $USER or $HOME or actually get the variables我的語法錯誤嗎?我可以將參數作為 args []string 傳遞,但這似乎沒有什么區別。我知道如果我將它們寫入 CMD 行或 bash 腳本中它們會起作用。如果您發現有問題,請告訴我。
查看完整描述

2 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

exec.Command()不在 shell 內運行,它只運行命令。這對您來說意味著它不會擴展環境變量 (?$HOME) 或執行重定向 (?>,?>>),因為這是 shell 的工作。

exec.Command()除非絕對必要,否則我不建議在內部運行 shell ,因為所需的不受信任輸入的引用可能很棘手,并且很可能出現錯誤(包括安全問題)。

您可以使用os.ExpandEnv()os.GetEnv()來加載環境變量。您可以通過讀取輸出然后將其寫入所需的文件來進行重定向,例如使用ioutil.WriteFile().

把它們放在一起看起來像(未經測試):

// Expand the $HOME variable.

systemInfoLoc := os.ExpandEnv("$HOME/systemvar.txt")


// Run uname command and get both stdout and stderr

getSystemKernel, err := exec.Command("uname", "-s").CombinedOutput()

if err != nil {

? ? // Show error and output

? ? log.Fatalf("%s: %s", err, getSystemKernel)

}


// Write result to file

err = ioutil.WriteFile("home/username/system.txt", getSystemKernel, 0644)

if err != nil {

? ? log.Fatal(err)

}


查看完整回答
反對 回復 2023-07-31
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

間接是 shell 的一項功能。如果您想使用間接,您有以下兩種選擇之一:

  • 通過 shell 運行它。

    getSystemKernel := exec.Command("/bin/sh", "-c", "uname -s >> home/username/system.txt")
  • 使用該os/exec包,并自己處理程序的輸出流。


查看完整回答
反對 回復 2023-07-31
  • 2 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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