3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個贊
更通用,更好的輸出。
使用exec.Command以及緩沖區(qū)來記錄輸出并僅在有用時(shí)顯示它。
您甚至可以通過使用可變參數(shù),即任意數(shù)量元素的參數(shù),使函數(shù)與任何命令一起工作。
適當(dāng)?shù)貥?biāo)記未處理的錯誤,因此如果命令失敗,您將被告知是哪一個以及原因。
最后請注意,Go 雖然具有表現(xiàn)力,但它是一種非常原始的語言。它白白握著你的手。您將不得不自己編寫大量程序。
示例代碼:
package main
import (
"bytes"
"fmt"
"os"
"os/exec"
"runtime"
"strings"
)
func main() {
runCommand(currentFunction(), "ping", "-c1", "google.commm")
}
func commandErrorMessage(stderr bytes.Buffer, program string) string {
message := string(stderr.Bytes())
if len(message) == 0 {
message = "the command doesn't exist: " + program + "\n"
}
return message
}
func currentFunction() string {
counter, _, _, success := runtime.Caller(1)
if !success {
println("functionName: runtime.Caller: failed")
os.Exit(1)
}
return runtime.FuncForPC(counter).Name()
}
func printCommandError(stderr bytes.Buffer, callerFunc string, program string, args ...string) {
printCommandErrorUbication(callerFunc, program, args...)
fmt.Fprintf(os.Stderr, "%s", commandErrorMessage(stderr, program))
}
func printCommandErrorUbication(callerFunc string, program string, args ...string) {
format := "error at: %s: %s %s\n"
argsJoined := strings.Join(args, " ")
fmt.Fprintf(os.Stderr, format, callerFunc, program, argsJoined)
}
func runCommand(callerFunc string, program string, args ...string) {
command := exec.Command(program, args...)
var stderr bytes.Buffer
command.Stderr = &stderr
fail := command.Run()
if fail != nil {
printCommandError(stderr, callerFunc, program, args...)
os.Exit(1)
}
}
示例運(yùn)行:
$ go run test.go
error at: main.main: ping -c1 google.commm
ping: google.commm: Name or service not known
exit status 1
添加回答
舉報(bào)