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

Golang SIGSEGV on *second* call only

Golang SIGSEGV on *second* call only

Go
潇湘沐 2023-05-08 15:11:55
我有一种快速运行 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 stringif 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 指针取消引用错误,更不用说为什么它只会在第二次调用时发生。
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

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 {


查看完整回答
反对 回复 2023-05-08
?
森栏

TA贡献1810条经验 获得超5个赞

这是因为这一行而发生的:

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

如果您运行的是 CentOS,则err := cmd.Run()不会返回任何错误。然后errnil。但在return排队你回来了err.Error()。您不能使用对 nil 指针的访问。所以,你收到了这个错误。


查看完整回答
反对 回复 2023-05-08
  • 2 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

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