水一篇文章
使用golang 调用系统命令并获得输出
import(
"bytes"
"os/exec"
"syscall"
)
func callsys(cmd string, args []string) (string, int) {
command := exec.Command(cmd, args...)
outinfo := bytes.Buffer{}
errinfo := bytes.Buffer{}
command.Stdout = &outinfo
command.Stderr = &errinfo
err := command.Start()
if err != nil {
fmt.Print(err.Error())
return "", -1
}
if err = command.Wait(); err != nil {
errCode := command.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()
return errinfo.String(), errCode
} else {
errCode := command.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()
return outinfo.String(), errCode
}
}
上方的方法会调用指定的系统命令。并将输出的消息以及状态码返回。这时候可以获取到返回之后自行处理逻辑
调用 golang 命令并直接输出控制窗口
有时候,调用系统命令后,程序不需要进行处理,直接输出在控制台,供用户查看即可。那么可以直接将输出流重定向:
import(
"os"
"os/exec"
"syscall"
)
func callsys(cmd string, args []string) int {
command := exec.Command(cmd, args...)
// outinfo := bytes.Buffer{}
// errinfo := bytes.Buffer{}
// command.Stdout = &outinfo
// command.Stderr = &errinfo
// 上面的方法是将数据缓存一下
// 在这里的方法是直接重定向数据输出流
command.Stdout = os.Stdout
command.Stderr = os.Stderr
command.Stdin = os.Stdin
err := command.Start()
if err != nil {
fmt.Print(err.Error())
return -1
}
if err = command.Wait(); err != nil {
errCode := command.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()
// fmt.Print(errinfo.String())
return errCode
} else {
// fmt.Print(command.ProcessState.Pid())
errCode := command.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()
// fmt.Print(outinfo.String())
return errCode
}
}
经过简单改造后,此方法不会将系统调用的输出或者错误作为返回值。而是直接定向到系统的输出流