Как я могу проанализировать вывод из exec.Command, в то же время входя в систему в режиме реального времени в os.Stdout? - PullRequest
0 голосов
/ 28 сентября 2018

В небольшом приложении Go я запускаю команду с помощью пакета os / exec.В настоящее время я прохожу через вывод журнала, установив:

cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
err := cmd.Run()

Что я хотел бы сейчас сделать, это получить вывод журнала (в частности, 2-ю последнюю строку) и сохранить его в переменной.Я думал, что это будет так же просто, как изменить err := cmd.Run() на cmdOutput, err := cmd.Output() и синтаксический анализ строки журнала для искомого значения - однако это вызывает ошибку, говорящую exec: Stdout already set.

Я мог бы удалитьзначение cmd.Stdout, но мне все равно хотелось бы, чтобы остальная часть вывода журнала проходила через текущий процесс так же, как сейчас.

У меня есть контроль над программой, которую я передаю какну, так что если есть лучший способ отправить фрагмент JSON из дочерней команды / процесса в родительское приложение Go, кроме записи файла на диск, это тоже подойдет.

Любая помощь будет принята с благодарностью -Я немного скраб голанга ...

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете использовать io.MultiWriter вместе с bytes.Buffer для этого:

var errBuf, outBuf bytes.Buffer
cmd.Stderr = io.MultiWriter(os.Stderr, &errBuf)
cmd.Stdout = io.MultiWriter(os.Stdout, &outBuf)
err := cmd.Run()

Это все равно будет вести к os.Stdout и os.Stderr, но вы можете использовать errBuf.Bytes() для получения вывода об ошибке и outBuf.Bytes() для получения нормального вывода.outBuf.Bytes() даст вам фрагмент байта, эквивалентный тому, который был возвращен cmd.Output().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...