使用exec.Cmd.Run()运行命令时如何获取所有输出行?

时间:2015-11-09 08:18:09

标签: go command output stdout

我正在使用glide来管理项目的依赖项。我创建了一个运行go test $(glide novendor)的脚本(它测试所有目录,不包括 vendor / 一个)。虽然它有效,但run命令的输出不会超出第1行:

ok my/project/scripts 0.005s

以下是运行它的脚本部分:

// Get the paths to test (excluding the "vendor/" directory)
cmd := exec.Command("glide", "novendor")
var out bytes.Buffer
cmd.Stdout = &out
err = cmd.Run()
if err != nil {
    log.Fatal("Could not run `glide novendor`: ", err)
}
glidenovendor := []string{"test"}
// Represents the "test ./src/... ./scripts/..." portion of the command
glidenovendor = append(glidenovendor, strings.Split(out.String(), " ")...)

// Run `go test ./src/... ./scripts/...`
cmd = exec.Command("go", glidenovendor...)
cmd.Stdout = os.Stdout
err = cmd.Run()
if err != nil {
    log.Fatal("Could not run `go test` command with args: ", cmd, err)
}

直接在我的shell上运行命令,可以按预期输出所有输出行。

如何让我的脚本打印整个输出?

1 个答案:

答案 0 :(得分:0)

事实证明这一行

glidenovendor = append(glidenovendor, strings.Split(out.String(), " ")...)

由于某种原因在"\n"切片的最后一个字符串元素中添加了一个新的行字符glidenovendor。我仍然不知道为什么。但是使用下面的代码段删除会使脚本按预期运行:

// Remove trailing LF from strings in `glidenovendor`
for i, v := range glidenovendor {
    glidenovendor[i] = strings.Trim(v, "\n")
}