यहाँ @ tux21b के आधार पर मेरे उन्नत संस्करण है पता लगाने के लिए ' रों जवाब
utils/cmd.go
package utils
import (
"bytes"
"log"
"os/exec"
"syscall"
)
const defaultFailedCode = 1
func RunCommand(name string, args ...string) (stdout string, stderr string, exitCode int) {
log.Println("run command:", name, args)
var outbuf, errbuf bytes.Buffer
cmd := exec.Command(name, args...)
cmd.Stdout = &outbuf
cmd.Stderr = &errbuf
err := cmd.Run()
stdout = outbuf.String()
stderr = errbuf.String()
if err != nil {
// try to get the exit code
if exitError, ok := err.(*exec.ExitError); ok {
ws := exitError.Sys().(syscall.WaitStatus)
exitCode = ws.ExitStatus()
} else {
// This will happen (in OSX) if `name` is not available in $PATH,
// in this situation, exit code could not be get, and stderr will be
// empty string very likely, so we use the default fail code, and format err
// to string and set to stderr
log.Printf("Could not get exit code for failed program: %v, %v", name, args)
exitCode = defaultFailedCode
if stderr == "" {
stderr = err.Error()
}
}
} else {
// success, exitCode should be 0 if go is ok
ws := cmd.ProcessState.Sys().(syscall.WaitStatus)
exitCode = ws.ExitStatus()
}
log.Printf("command result, stdout: %v, stderr: %v, exitCode: %v", stdout, stderr, exitCode)
return
}
मैं इस पर परीक्षण किया है ओएसएक्स, अगर यह अन्य प्लेटफॉर्म पर अपेक्षित काम नहीं कर रहा है, तो कृपया मुझे बताएं ताकि हम इसे बेहतर बना सकें।
मैंने दस्तावेज़ों में देखा लेकिन 'प्रोसेसस्टेट' से 'वेटस्टैटस' तक जाने का तरीका कभी नहीं मिला, आपने यह कैसे किया? इसके अलावा मुझे मेलिंग सूची में समाधान मिला है (जैसा कि आपने वर्णन किया है) https://groups.google.com/forum/?fromgroups#!searchin/golang-nuts/exit$20code/golang- पागल/dKbL1oOiCIY/Bz_haQYmMrcJ मैं इसे विंडोज़ में आजमा रहा हूं और आपको बताता हूं :) – OscarRyz
यह निश्चित रूप से बाहर निकलने के लिए आसान नहीं है, लेकिन दस्तावेज़ कम से कम कुछ संकेत प्रदान करते हैं जहां आपको अगला देखना है। लेकिन वे विंडोज का बिल्कुल उल्लेख नहीं करते हैं, इसलिए मैं आपके उत्तर की प्रतीक्षा कर रहा हूं। – tux21b
मेलिंग सूची विंडोज विशिष्ट के बारे में कुछ कहती है, लेकिन मैंने अभी यह कोड चलाया है और सही काम करता है, यह 1 पर है। – OscarRyz