2016-04-08 4 views
0

Я пытаюсь запустить сценарий оболочки из моей программы go. Я хочу запустить экземпляр mongo, а затем удалить некоторые данные. Так что сценарий оболочки будет выглядеть примерно так:Цепочки команд оболочки golang

mongo 

use test-db 

db.user.remove({"id": 1}) 

я сначала пытался просто с помощью exec.Command пакета, но это не цепочки команд ПОЭТОМУ УКАЗАННЫЕ Монго дб закрывается, и я не могу запустить другие команды:

cmd := exec.Command("mongo", "test-db") 
cmd.Start() 
cmd1 := exec.Command("db.remove({\"id\": 1})") 
cmd1.Run() 
cmd.Wait() 

следующая вещь, которую я пытался создает переменную и пытается выполнить это через ш:

var script = ` 
#!/bin/bash 

mongo 

use test-db 

db.user.remove({"id": 1}) 
` 

и выполнение exec.Command("sh", script)

Я знаю, что могу создать файл .sh, но я не хочу этого делать, если есть способ перехватывать команды в go, поэтому mongo db не закрывается, и я могу выполнить другие команды?

ответ

3

Вы, кажется, не понимают, как процессы (например, переводчиков и оболочек, в том числе — it appearsmongodb а) работать с их так называемым standard streams: в то время как «тест-БД» действительно аргумент перейти к 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 

Чтобы объяснить, как это работает, давайте приведем manual:

Stdin определяет стандартный ввод процесса.
Если Stdin - nil, процесс считывается с нулевого устройства (os.DevNull).
Если Stdin является *os.File, стандартный вход процесса подключен непосредственно к этому файлу.
В противном случае во время выполнения команды отдельный goroutine считывает с Stdin и передает эти данные команде по трубе. В этом случае Wait не будет завершен до тех пор, пока goroutine не прекратит копирование, поскольку он достиг конца Stdin (EOF или ошибка чтения) или потому, что запись в трубку возвратила ошибку.
Stdin io.Reader

Так в основном вы создаете объект, который принимает строку и обеспечивает что-то реализующего io.Reader и «провод» на стандартный ввод процесса о должны быть созданы. Как только процесс начнется, os/exec обязательно запустит goroutine, который перевернет данные между вашей строкой и запущенным экземпляром mongodb —, как если бы вы начали вручную и набрали эту строку на свой стандартный поток ввода.

Обратите внимание, что вы, возможно, потребуется, чтобы проверить, что mongodb генерирует на стандартном выходе потоков — особенно stderr, — потому что, если он встречает какие-либо ошибки при выполнении сценария отправленные вами к нему, он, вероятно, сообщать о них там.