• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    利用Golang如何调用Linux命令详解
    POST TIME:2021-10-18 17:41

    本文介绍的是Golang使用 os/exec 来执行 Linux 命令,分享出来供大家参考学习,下面来看看详细的介绍:

    下面是一个简单的示例:

     package main
     
     import (
      "fmt"
      "io/ioutil"
      "os/exec"
     )
     
     func main() {
      cmd := exec.Command("/bin/bash", "-c", `df -lh`)
     
      //创建获取命令输出管道
      stdout, err := cmd.StdoutPipe()
      if err != nil {
       fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)
       return
      }
     
      //执行命令
      if err := cmd.Start(); err != nil {
       fmt.Println("Error:The command is err,", err)
       return
      }
     
      //读取所有输出
      bytes, err := ioutil.ReadAll(stdout)
      if err != nil {
       fmt.Println("ReadAll Stdout:", err.Error())
       return
      }
     
      if err := cmd.Wait(); err != nil {
       fmt.Println("wait:", err.Error())
       return
      }
      fmt.Printf("stdout:\n\n %s", bytes)
     }

    或者创建一个缓冲读取器按行读取:

     package main
     
     import (
      "bufio"
      "fmt"
      "os/exec"
     )
     
     func main() {
      cmd := exec.Command("/bin/bash", "-c", `df -lh`)
     
      //创建获取命令输出管道
      stdout, err := cmd.StdoutPipe()
      if err != nil {
       fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)
       return
      }
     
      //执行命令
      if err := cmd.Start(); err != nil {
       fmt.Println("Error:The command is err,", err)
       return
      }
     
      //使用带缓冲的读取器
      outputBuf := bufio.NewReader(stdout)
     
      for {
     
       //一次获取一行,_ 获取当前行是否被读完
       output, _, err := outputBuf.ReadLine()
       if err != nil {
     
        // 判断是否到文件的结尾了否则出错
        if err.Error() != "EOF" {
         fmt.Printf("Error :%s\n", err)
        }
        return
       }
       fmt.Printf("%s\n", string(output))
      }
     
      //wait 方法会一直阻塞到其所属的命令完全运行结束为止
      if err := cmd.Wait(); err != nil {
       fmt.Println("wait:", err.Error())
       return
      }
     }

    输出结果:

    在写这句 if err.Error() != "EOF" 时,一直以为可以直接将 error 类型直接转为 string 然后就可以比较了,所以刚开始写的代码是这样的 if string(err) != "EOF" ,但是一直报下面这个错误:

     # command-line-arguments
     ./exec_command.go:36: cannot convert err (type error) to type string

    于是查了下才明白,error 类型本身是一个预定义好的接口,里面定义了一个method:

     type error interface {
      Error() string
     }

    所以 err.Error() 才是一个 string 类型的返回值。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • golang执行命令操作 exec.Command
    • Golang中基础的命令行模块urfave/cli的用法说明
    • golang执行命令获取执行结果状态(推荐)
    • Golang命令行进行debug调试操作
    • golang中命令行库cobra的使用方法示例
    • Golang汇编命令解读及使用
    上一篇:利用Golang生成整数随机数方法示例
    下一篇:golang 函数以及函数和方法的详解及区别
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信