aquí está mi versión mejorada basada en tux21b @ ' s respuesta
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
}
he probado en OSX, si no funciona como se espera en otras plataformas, dígamelo para que podamos hacerlo mejor.
Miré en los documentos pero nunca encontré la manera de pasar de 'ProcessState' a' WaitStatus' ¿cómo hiciste eso ?. También acabo de encontrar en la lista de correo la solución (al igual que la que ha descrito) https://groups.google.com/forum/?fromgroups#!searchin/golang-nuts/exit$20code/golang- nuts/dKbL1oOiCIY/Bz_haQYmMrcJ Lo estoy intentando ahora en Windows y le hago saber :) – OscarRyz
Definitivamente no es tan fácil obtener el código de salida, pero los documentos proporcionan al menos algunos consejos donde debe mirar a continuación. Pero no mencionan a Windows, así que espero su respuesta. – tux21b
La lista de correo dice algo sobre Windows específico, pero acabo de ejecutar este código y funciona perfecto, esto está en go1. – OscarRyz