golang 调用系统命令并输出

golang 调用系统命令并输出

水一篇文章

使用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
    }
}

经过简单改造后,此方法不会将系统调用的输出或者错误作为返回值。而是直接定向到系统的输出流

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2021/03/11/golang调用系统命令并输出

Buy me a cup of coffee ☕.