我试图检查是否在系统中安装了包(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?
由于命令错误,您的程序没有退出。
它正在退出,因为你把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