当我运行以下代码时:

cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println("Result: " + out.String())

我收到以下错误:

退出状态1

但是,这对调试错误的确切原因没有帮助.

如何获得更详细的信息?

推荐答案

解决方案是使用Command对象的Stderr属性.可以这样做:

cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
    fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
    return
}
fmt.Println("Result: " + out.String())

运行上面的代码,就可以清楚地知道问题是什么:

退出状态1:FIND:-EXEC:无终止";"或"+"

Edit:

在上面的代码中,我们希望在出现错误的情况下,消息将打印到stderr,命令将返回非零错误代码.这或多或少是标准.

但是,正如@snorberhuis下面提到的,一些命令会将错误打印到stdout.其他命令可能会打印到stderr,但返回错误代码0(在这种情况下,err将是nil).在stderr中有消息并不一定意味着有错误(ffmpeg工具经常这样做).

因此,基本上,您可能需要调整上面的代码,以适应预期的命令.

Go相关问答推荐

如何将泛型函数作为参数传递给golang中的另一个函数?

如何存储来自异步Goroutine的返回值列表?

GORM没有从 struct 创建完整的表,如何修复?

仅呈现一个模板的GIN Web应用程序

GORM Find方法中缺少字段

带有一个新变量的Go冒号等于运算符

理解Golang中的IOTA和常量

我怎样才能改进这个嵌套逻辑以使其正常工作并提高性能

在 Go 中将元数据从一个 JPEG 复制到另一个

通过 Terraform 中的 MapNestedAtribute 进行迭代

如何将字节文件高效地读入int64切片?

使用Cookie身份验证的Gorilla Golang Websocket优化

如何将整数哈希细分为范围

我在 go 中制作的递归函数有什么问题?

如何使用 go-playground/validator 编写 snake case 绑定标签?

数据流中的无根单元错误,从 Golang 中的 PubSub 到 Bigquery

Go 并发、goroutine 同步和关闭通道

在 Raspberry Pi4 上下载 Go Mod

当 git clone 工作时,Go mod tidy 在私有存储库上失败

不理解切片和指针