猿问

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

我正在使用glide来管理对我的项目的依赖。我为我创建了一个运行脚本go test $(glide novendor)(它测试所有目录,不包括供应商/一个)。当它工作时,运行命令的输出不会超出第一行:


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 上运行命令会按预期给出所有输出行。


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


米琪卡哇伊
浏览 177回答 1
1回答

鸿蒙传说

原来那条线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")}
随时随地看视频慕课网APP

相关分类

Go
我要回答