golang执行Linux和Windows命令

Posted embedded-linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang执行Linux和Windows命令相关的知识,希望对你有一定的参考价值。

1. 可接收变参命令

package main
import (
    "fmt"   
    "os"
    "os/exec"
    "strings"
)

func main()
    sliceFunc(os.Args[1:]...)


func sliceFunc(cmd... string)
    fmt.Println(cmd)
    if len(cmd) == 0  
        fmt.Printf("Usage: %s args...\\n", os.Args[0])
        os.Exit(-1)
       
    fmt.Println(cmdFunc(cmd...))


func cmdFunc(cmd... string) string 
    fmt.Printf("cmd slice len: %d, value:%v\\n", len(cmd),  cmd)
    result, err := exec.Command(cmd[0], cmd[1:]...).Output()
    if err != nil 
        fmt.Println("Command failed:", err.Error())
       

//  return string(result)  // with ‘\\n‘
    return strings.TrimSpace(string(result))

执行结果:

$ go run slice.go uname -a
[uname -a]
cmd slice len: 2, value:[uname -a]
Linux e531 5.0.0-29-generic #31~18.04.1-Ubuntu SMP Thu Sep 12 18:29:21 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ go run slice.go uname 
[uname]
cmd slice len: 1, value:[uname]
Linux

2. Linux和Windows命令

只接收单个命令并执行:

package main

import (
    "fmt"
    "errors"
    "os"
    "os/exec"
    "runtime"
    "strings"
)

func main()
    if len(os.Args) == 1
        fmt.Printf("Usage: %s args...\\n", os.Args[0])
        os.Exit(-1)
    
    str1, err := RunCommandWithErr(os.Args[1])
    if err != nil 
        fmt.Println(err.Error())
     else 
        fmt.Println(str1)    
    

    str := RunCommand(os.Args[1])    
    fmt.Println(str)    


func runInLinux(cmd string) string
    fmt.Println("Running Linux cmd:" , cmd)
    result, err := exec.Command("/bin/sh", "-c", cmd).Output()
    if err != nil 
        fmt.Println(err.Error())
    
    return strings.TrimSpace(string(result))


func runInWindows(cmd string) string
    fmt.Println("Running Win cmd:", cmd)
    result, err := exec.Command("cmd", "/c", cmd).Output()
    if err != nil 
        fmt.Println(err.Error())
    
    return strings.TrimSpace(string(result))


func RunCommand(cmd string) string
    if runtime.GOOS == "windows" 
        return runInWindows(cmd)
     else 
        return runInLinux(cmd)
    


func RunLinuxCommand(cmd string) string
    if runtime.GOOS == "windows" 
        return ""
     else 
        return runInLinux(cmd)
    


func runInLinuxWithErr(cmd string) (string, error) 
    fmt.Println("Running Linux cmd:"+cmd)
    result, err := exec.Command("/bin/sh", "-c", cmd).Output()
    if err != nil 
        fmt.Println(err.Error())
    
    return strings.TrimSpace(string(result)), err


func runInWindowsWithErr(cmd string) (string, error)
    fmt.Println("Running Windows cmd:"+cmd)
    result, err := exec.Command("cmd", "/c", cmd).Output()
    if err != nil 
        fmt.Println(err.Error())
    
    return strings.TrimSpace(string(result)), err


func RunCommandWithErr(cmd string) (string, error)
    if runtime.GOOS == "windows" 
        return runInWindowsWithErr(cmd)
     else 
        return runInLinuxWithErr(cmd)
    


func RunLinuxCommandWithErr(cmd string)(string, error)
    if runtime.GOOS == "windows" 
        return "", errors.New("could not run in Windows Os") 
     else 
        return runInLinuxWithErr(cmd)
    

执行结果:

$ go run cmd.go uname
Running Linux cmd:uname
Linux
Running Linux cmd: uname
Linux
$ go run cmd.go uname -a
Running Linux cmd:uname
Linux
Running Linux cmd: uname
Linux

 

参考:

1. golang功能代码

以上是关于golang执行Linux和Windows命令的主要内容,如果未能解决你的问题,请参考以下文章

golang 调用 c++动态库(winlinux环境)

Golang开发环境搭建

Golang开发环境搭建

Windows和linux通过命令互传文件

Golang 如何交叉编译

minio 介绍