1 回答

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, - 因為如果在執行您提交給它的腳本時遇到任何錯誤,它可能會在那里報告它們。
- 1 回答
- 0 關注
- 168 瀏覽
添加回答
舉報