猿问

Golang SIGSEGV on *second* call only

我有一种快速运行 shell 命令的方法:


func runcmd(c string, arg ...string) (string, string, string) {

    var o bytes.Buffer

    var e bytes.Buffer

    cmd := exec.Command(c, arg...)

    cmd.Stdout = &o

    cmd.Stderr = &e

    err := cmd.Run()

    return o.String(), e.String(), err.Error()

}

在我的主要有以下代码:


func main() {


ver, _, exitcode := runcmd("rpm", "-q", "--queryformat", "%{VERSION}", "redhat-release")

var dist string

if exitcode != "" {

    ver, _, exitcode = runcmd("rpm", "-q", "--queryformat", "%{VERSION}", "centos-release")

    if exitcode != "" {

        fmt.Println("Unknown OS! Exiting without running!")

        os.Exit(3)

    }

    dist = "CentOS"

} else {

    dist = "Redhat/Redhat derivative"

}


fmt.Printf("System is %s %s.\n", dist, ver)

}

运行它会产生一个 SIGSEGV。但是,当我发表评论时,对它的第二次调用runcmd正常运行(返回Unknown OS! Exiting without running! exit status 3)。我是新手,所以我并不真正理解 nil 指针取消引用错误,更不用说为什么它只会在第二次调用时发生。


潇湘沐
浏览 116回答 2
2回答

函数式编程

err.Error()当没有错误 ( ) 时,您总是会返回,err == nil这会因零指针取消引用而失败。你应该做func runcmd(c string, arg ...string) (string, string, error) {  e bytes.Buffer  cmd := exec.Command(c, arg...)  cmd.Stdout = &o  cmd.Stderr = &e  err := cmd.Run()  return o.String(), e.String(), err}进而if exitcode != nil {

森栏

这是因为这一行而发生的:return o.String(), e.String(), err.Error()如果您运行的是 CentOS,则err := cmd.Run()不会返回任何错误。然后err会nil。但在return排队你回来了err.Error()。您不能使用对 nil 指针的访问。所以,你收到了这个错误。
随时随地看视频慕课网APP

相关分类

Go
我要回答