Golang 调用 Linux 命令

Golang 调用 Linux 命令

 Golang  struggling   2年前 (2016-12-22)   1448次浏览   已收录  1个评论

Golang 中可以使用 os/exec 来执行 Linux 命令,下面是一个简单的示例:

 
 
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os/exec"
  6. )
  7. func main() {
  8. cmd := exec.Command("/bin/bash", "-c", `df -lh`)
  9. //创建获取命令输出管道
  10. stdout, err := cmd.StdoutPipe()
  11. if err != nil {
  12. fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)
  13. return
  14. }
  15. //执行命令
  16. if err := cmd.Start(); err != nil {
  17. fmt.Println("Error:The command is err,", err)
  18. return
  19. }
  20. //读取所有输出
  21. bytes, err := ioutil.ReadAll(stdout)
  22. if err != nil {
  23. fmt.Println("ReadAll Stdout:", err.Error())
  24. return
  25. }
  26. if err := cmd.Wait(); err != nil {
  27. fmt.Println("wait:", err.Error())
  28. return
  29. }
  30. fmt.Printf("stdout:\n\n %s", bytes)
  31. }

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

 
 
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os/exec"
  6. )
  7. func main() {
  8. cmd := exec.Command("/bin/bash", "-c", `df -lh`)
  9. //创建获取命令输出管道
  10. stdout, err := cmd.StdoutPipe()
  11. if err != nil {
  12. fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)
  13. return
  14. }
  15. //执行命令
  16. if err := cmd.Start(); err != nil {
  17. fmt.Println("Error:The command is err,", err)
  18. return
  19. }
  20. //使用带缓冲的读取器
  21. outputBuf := bufio.NewReader(stdout)
  22. for {
  23. //一次获取一行,_ 获取当前行是否被读完
  24. output, _, err := outputBuf.ReadLine()
  25. if err != nil {
  26.  
  27. // 判断是否到文件的结尾了否则出错
  28. if err.Error() != "EOF" {
  29. fmt.Printf("Error :%s\n", err)
  30. }
  31. return
  32. }
  33. fmt.Printf("%s\n", string(output))
  34. }
  35. //wait 方法会一直阻塞到其所属的命令完全运行结束为止
  36. if err := cmd.Wait(); err != nil {
  37. fmt.Println("wait:", err.Error())
  38. return
  39. }
  40. }

输出结果:

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

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

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

 
 
  1. type error interface {
  2. Error() string
  3. }

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

转自: http://www.tianfeiyu.com/?p=2673

猜你喜欢

转载自blog.csdn.net/weixin_40592935/article/details/80888212
今日推荐