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

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

鏈接 shell 命令 golang

鏈接 shell 命令 golang

Go
慕的地8271018 2022-01-04 10:16:13
我正在嘗試從我的 go 程序中運行一個 shell 腳本。我想啟動一個mongo實例,然后刪除一些數據。所以 shell 腳本看起來像這樣:mongouse test-dbdb.user.remove({"id": 1})我最初嘗試只使用該exec.Command包,但它沒有鏈接命令,因此 mongo db 關閉并且我無法運行其他命令:cmd := exec.Command("mongo", "test-db")cmd.Start()cmd1 := exec.Command("db.remove({\"id\": 1})")cmd1.Run()cmd.Wait()我嘗試的下一件事是創建一個變量并嘗試通過 sh 執行它:var script = ` #!/bin/bashmongouse test-dbdb.user.remove({"id": 1})`并執行 exec.Command("sh", script)我知道我可以創建一個.sh文件,但我不想這樣做,有沒有辦法在 go 中鏈接命令,這樣 mongo db 就不會關閉,我可以執行其他命令?
查看完整描述

1 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

您似乎誤解了進程(例如解釋器和 shell,包括——看起來——mongodb以及)如何與其所謂的標準流一起工作:而“test-db”確實是傳遞mongodb給要在其上創建的進程的參數它的命令行,db.user.remove({"id": 1})是生成的mongodb實例應該從其標準輸入流中讀取的文本。


所以基本上你需要這個:


import (

    "os/exec"

    "strings"

)


cmd := exec.Command("mongo", "test-db")

cmd.Stdin = strings.NewReader(`db.user.remove({"id": 1})\n`)

err := cmd.Run()

// Check for an error

為了解釋這是如何工作的,讓我們引用手冊:


Stdin指定進程的標準輸入。

如果Stdin是nil,則進程從空設備 ( os.DevNull)讀取。

如果Stdin是*os.File,則進程的標準輸入直接連接到該文件。

否則,在命令執行期間,一個單獨的 goroutine 從Stdin管道中讀取數據并將其傳遞給命令。在這種情況下,Wait在 goroutine 停止復制之前不會完成,要么是因為它已到達Stdin (EOF 或讀取錯誤)的末尾,要么是因為寫入管道返回了錯誤。

Stdin io.Reader


所以基本上你創建一個對象,它接受一個字符串并提供一些實現io.Reader并將它“連接”到將要創建的進程的標準輸入。一旦該過程開始,os/exec將確保生成一個 goroutine,它將在您的字符串和正在運行的mongodb實例之間鏟除數據——就像您mongodb手動啟動并將該字符串直接鍵入到其標準輸入流中一樣。


請注意,您可能還需要檢查mongodb在其標準輸出流上生成的內容- 特別是stderr, - 因為如果在執行您提交給它的腳本時遇到任何錯誤,它可能會在那里報告它們。


查看完整回答
反對 回復 2022-01-04
  • 1 回答
  • 0 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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