为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
米琪卡哇伊 2021-11-22 15:15:15
我正在使用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.Buffercmd.Stdout = &outerr = cmd.Run()if err != nil {    log.Fatal("Could not run `glide novendor`: ", err)}glidenovendor := []string{"test"}// Represents the "test ./src/... ./scripts/..." portion of the commandglidenovendor = append(glidenovendor, strings.Split(out.String(), " ")...)// Run `go test ./src/... ./scripts/...`cmd = exec.Command("go", glidenovendor...)cmd.Stdout = os.Stdouterr = cmd.Run()if err != nil {    log.Fatal("Could not run `go test` command with args: ", cmd, err)}直接在我的 shell 上运行命令会按预期给出所有输出行。如何让我的脚本打印整个输出?
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

原来那条线


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")

}


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信