Ваша программа не выходит из-за ошибки команды.
Это выход, потому что вы положили log.Fatal(err)
.
log.Fatal
выходит из программы с SIGINT 1, если вы просто хотите зарегистрировать ошибку, выполните log.Println(err)
. Смотрите документ здесь: https://golang.org/pkg/log/#Logger.Fatal
Кроме того, чтобы сделать это, вы должны вспомнить ошибку и позволить вызывающей функции обработать ошибку.
Теперь, что касается того, что вы хотите сделать, я предлагаю использовать функцию LookPath
пакета exec
, она делает именно то, что вы хотите, ища исполняемый файл с заданным именем в вашем пути. Вот документация: 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