os/exec如何在去语言中执行命令

  介绍

这篇文章给大家介绍os/exec如何在去语言中执行命令,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

在Golang中用于执行命令的库是<代码> os/exec> Cmd>

    <李>只执行命令,不获取结果李 <>李执行命令,并获取结果(不区分stdout和stderr)李 <>李执行命令,并获取结果(区分stdout和stderr)

<强>第一种:只执行命令,不获取结果

直接调用Cmd对象的运行函数,返回的只有成功和失败,获取不到任何输出的结果。

主要包
  
  导入(
  “log"
  “os/exec"
  )
  
  函数main () {
  cmd:=exec.Command (“ls",“-l",,/var/log/?
  错:=cmd.Run ()
  如果犯错!=nil {
  log.Fatalf (“cmd.Run () % s \ n"失败、犯错)
  }
  }

<强>第二种:执行命令,并获取结果

有时候我们执行一个命令就是想要获取输出结果,此时你可以调用Cmd的CombinedOutput函数。

主要包
  
  导入(
  “fmt"
  “log"
  “os/exec"
  )
  
  函数main () {
  cmd:=exec.Command (“ls",“-l",,/var/log/?
  ,犯错:=cmd.CombinedOutput ()
  如果犯错!=nil {
  fmt.Printf(“联合:\ n % s \ n", string ())
  log.Fatalf (“cmd.Run () % s \ n"失败、犯错)
  }
  fmt.Printf(“联合:\ n % s \ n", string ())
  }

CombinedOutput函数,只返回,并不区分stdout和stderr。如果你想区分他们,可以直接看第三种方法。

美元去demo.go运行
  组合:
  总11540876
  -rw-r - r - 2根4096根2018年10月29日yum.log
  drwx根94 11月6——2根05:56审计
  -rw-r - r - 1根185249234根2019年11月28日消息
  -rw-r - r - 2根根16374年8月28日13。日志

不过在那之前,我却发现一个小问题:有时候,壳牌命令能执行,并不代码执行也能执行。

比如我只想查看<代码>/var/log/目录下的日志后缀名的文件呢?有点Linux基础的同学,都会用这个命令

 ls - l/var/log/*.log美元
  总计11540
  -rw-r - r - 2根4096根2018年10月29日/var/log/yum.log
  -rw-r - r - 2根根16374年8月28日13/var/log/boot.日志

按照这个写法将它放入到<代码>执行。命令代码

主要包
  
  导入(
  “fmt"
  “log"
  “os/exec"
  )
  
  函数main () {
  cmd:=exec.Command (“ls",“-l",,/var/log/* .log")
  ,犯错:=cmd.CombinedOutput ()
  如果犯错!=nil {
  fmt.Printf(“联合:\ n % s \ n", string ())
  log.Fatalf (“cmd.Run () % s \ n"失败、犯错)
  }
  fmt.Printf(“联合:\ n % s \ n", string ())
  }

什么情况?居然不行,报错了。

美元去demo.go运行
  组合:/var/log/*. ls:不能访问日志:没有这样的文件或目录
  
  2020/11/11 19:46:00 cmd.Run()失败的退出状态2
  退出状态1 

为什么会报错呢?壳明明没有问题啊

其实很简单,原来<代码> ls - l/var/log/*.日志> exec.Command (“ls",“-l",,/var/log/* .log")

上面这段代码对应的壳命令应该是下面这样,如果你这样子写,ls就会把参数里的内容当成具体的文件名,而忽略通配符<代码> *

 $ ls - l,/var/log/* .log"/var/log/*. ls:不能访问日志:没有这样的文件或目录

<强>第三种:执行命令,并区分stdout和stderr

上面的写法,无法实现区分标准输出和标准错误,只要换成下面种写法,就可以实现。

主要包
  
  导入(
  “bytes"
  “fmt"
  “log"
  “os/exec"
  )
  
  函数main () {
  cmd:=exec.Command (“ls",“-l",,/var/log/* .log")
  var stdout, stderr bytes.Buffer
  cmd。Stdout=和Stdout//标准输出
  cmd。Stderr=和Stderr//标准错误
  错:=cmd.Run ()
  errStr outStr:=字符串(stdout.Bytes()),字符串(stderr.Bytes ())
  fmt.Printf (“: \ n % s \ nerr: \ n % s \ n", outStr, errStr)
  如果犯错!=nil {
  log.Fatalf (“cmd.Run () % s \ n"失败、犯错)
  }
  }

输出如下,可以看到前面的报错内容被归入到标准错误里

美元去demo.go运行
  :
  
  错:/var/log/*. ls:不能访问日志:没有这样的文件或目录
  
  2020/11/11 19:59:31 cmd.Run()失败的退出状态2
  退出状态1 

os/exec如何在去语言中执行命令