Запуск os.execute для получения вывода - PullRequest
0 голосов
/ 03 ноября 2018

Я использую следующий код, который запускает команду для двоичного файла и должен обеспечить вывод

если я запускаю команду ftr get apps в моем Mac, я получаю

[app1 apps2]

Теперь я копирую двоичный файл в папку с тестовыми данными. и запустить код ниже, и я хочу получить приложения, в настоящее время нет ошибок, но я также не получаю данные, что здесь может отсутствовать?

    Cmd := exec.Command("ftr", "get", "apps")
    Cmd.Dir = "./testdata/"
    err := Cmd.Start()
    fmt.Println(err)
    bytes, e := Cmd.Output()
    fmt.Println(bytes, e)

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Вызов как Пуск, так и Выход избыточен.

Выход запускает команду и возвращает ее стандартный вывод.

Старт используется для асинхронного запуска команды. Просто удалите этот звонок:

    cmd := exec.Command("ftr", "get", "apps")
    cmd.Dir = "./testdata/"
    b, err := cmd.Output()
    fmt.Println(string(b), err)
0 голосов
/ 03 ноября 2018

У вас не будет прямого вывода, так как командам требуется некоторое время, прежде чем он запишет в stdout / stderr, поэтому вам нужно просто ждать, пока что-то получится.

Как вы можете это сделать, используя bufio.NewScanner, вот так:

package main

import (
    "bufio"
    "fmt"
    "os/exec"
    "strings"
)

func main() {
    args := "get apps"
    cmd := exec.Command("ftr", strings.Split(args, " ")...)
    cmd.Dir = "./testdata/"

    stdout, _ := cmd.StdoutPipe()
    cmd.Start()

    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanWords)

    for scanner.Scan() {
        m := scanner.Text()
        fmt.Println(m)
    }

    cmd.Wait()
}

Если ваша команда пишет в stderr вместо stdout, вам может потребоваться использовать cmd.StderrPipe вместо cmd.Stdoutpipe, чтобы получить вывод.

...