当前位置: 首页 > 编程笔记 >

利用Golang如何调用Linux命令详解

秦才
2023-03-14
本文向大家介绍利用Golang如何调用Linux命令详解,包括了利用Golang如何调用Linux命令详解的使用技巧和注意事项,需要的朋友参考一下

本文介绍的是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 类型的返回值。

总结

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

 类似资料:
  • 本文向大家介绍Linux下利用unzip命令如何解压多个文件详解,包括了Linux下利用unzip命令如何解压多个文件详解的使用技巧和注意事项,需要的朋友参考一下 linux中提示没有unzip命令解决方法 如果你如法使用unzip命令解压.zip文件,可能是你没有安装unzip软件,下面是安装方法 命令: yum list | grep zip/unzip #获取安装列表 安装命令: yum i

  • 问题内容: 我正在尝试使用重定向和管道从Java执行一些Linux命令。Java如何调用或命令? 我试图用这个: 但是它与重定向或管道不兼容。 问题答案: 在你的shell中不执行命令 尝试 代替。 编辑::我的系统上没有,所以我改用。以下为我工作

  • 本文向大家介绍Linux Vim 实用命令详解,包括了Linux Vim 实用命令详解的使用技巧和注意事项,需要的朋友参考一下 Linux常用命令   - 已学     cd (路径的切换) rm(后接-rf 可删除文件或文件夹) ls(查看当前路径下的文件和文件夹) mkdir(创建文件夹) touch(创建文件)     cat(查看文件内容)mv (移动文件,也可以重命名文件) rmdir(

  • 本文向大家介绍Linux下使用python调用top命令获得CPU利用率,包括了Linux下使用python调用top命令获得CPU利用率的使用技巧和注意事项,需要的朋友参考一下 本文定位:想通过python调用top命令获取cpu使用率但暂时没有思路的情况。 如果单纯为了获得cpu的利用率,通过top命令重定向可以轻松实现,命令如下: 或 这个就不解释了,不懂的朋友查询下top的帮助文档。这里要

  • 我想使用Windows 10上的命令行中的,以及许多其他Linux工具。我知道有GnuWin32和其他二进制替代品,但没有一个能像Linux的Windows子系统(WSL)那样优雅地工作;包括更新机制。 使用WSL,可以调用

  • 本文向大家介绍linux下source命令使用详解,包括了linux下source命令使用详解的使用技巧和注意事项,需要的朋友参考一下 Linux Source命令及脚本的执行方式解析 当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录;这时就想到用source命令,如:source /etc/profile 对source进行了学习,并且用它与sh 执行脚本进行了对比,现在