运行os.execute以获取输出

时间:2018-11-03 20:27:32

标签: go command command-line-interface

我使用以下代码对二进制文件运行命令并需要提供输出

如果我在Mac电脑上运行命令ftr get apps

[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 :(得分:2)

您不会直接获得输出,因为命令需要一些时间才能将其写入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才能获得输出。

答案 1 :(得分:1)

同时调用Start和Output是多余的。

  

Output运行命令并返回其标准输出。

启动用于异步运行命令。只需删除该呼叫即可:

    cmd := exec.Command("ftr", "get", "apps")
    cmd.Dir = "./testdata/"
    b, err := cmd.Output()
    fmt.Println(string(b), err)