如果安装了退出程序的系统软件包,请选中Go

问题描述 投票:-3回答:1

我试图检查是否在系统中安装了包(Centos / Yum)。我试图使用该exec.Command方法:

func YumCheckIfPackageInstalled(pkg string) string {
    out,err := exec.Command("yum", "list", "installed", pkg).Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Output %s\n", out)

    return "string"
}

问题是当安装“pkg”时程序继续工作,但如果不是,则退出时:

exit status 1

如何防止程序退出os命令错误?

我想要实现的是检查是否安装了一些软件包,如果没有,我想安装它们。也许有一些更好的方法来解决这个问题,而不是执行exec.Command-s?

go
1个回答
2
投票

由于命令错误,您的程序没有退出。

它正在退出,因为你把log.Fatal(err)

log.Fatal使用SIGINT 1退出程序,如果你只想记录错误,请执行log.Println(err)。请参阅此处的文档:https://golang.org/pkg/log/#Logger.Fatal

另外,要做到goway,你应该冒泡错误并让函数的调用者处理错误。

现在,关于你想做什么,我建议使用LookPath包的函数exec,它通过在你的路径中搜索具有给定名称的可执行文件来完成你想要的。这是doc:https://golang.org/pkg/os/exec/#LookPath

你可以这样做:

package main

import (
        "flag"
        "fmt"
        "log"
        "os/exec"
)

var pkg = flag.String("pkg", "", "package name")

func main() {
        flag.Parse()

        if !PackageInstalled(*pkg) {
                if err := InstallPackage(*pkg); err != nil {
                        log.Fatal(err)
                }
                fmt.Printf("Package %s installed\n", *pkg)
                return
        }
        fmt.Printf("Package %s already installed\n", *pkg)
}

func PackageInstalled(pkg string) bool {
        _, err := exec.LookPath(pkg)

        // check error
        if err != nil {
                // the executable is not found, return false
                if execErr, ok := err.(*exec.Error); ok && execErr.Err == exec.ErrNotFound {
                        return false
                }
                // another kind of error happened, let's log and exit
                log.Fatal(err)
        }

        return true
}

func InstallPackage(pkg string) error {
        // install your package
        // ...
        return nil
}

并以这种方式运行它go run main.go -pkg yum

© www.soinside.com 2019 - 2024. All rights reserved.