标准库之exec

1|0一、exec介绍

  • 有时候我们的go程序需要执行外部的命令,比如执行linux shell命令,一个其他语言编写的二进制文件,我们都可以通过调用go语言的exec包的函数来执行。

1|11. exec 函数和Cmd的方法

func Command(name string, arg ...string) *Cmd //方法返回一个*Cmd, 用于执行name指定的程序(携带arg参数) func (c *Cmd) Run() error //执行Cmd中包含的命令,阻塞直到命令执行完成 func (c *Cmd) Start() error //执行Cmd中包含的命令,该方法立即返回,并不等待命令执行完成 func (c *Cmd) Wait() error //该方法会阻塞直到Cmd中的命令执行完成,但该命令必须是被Start方法开始执行的 func (c *Cmd) Output() ([]byte, error) //执行Cmd中包含的命令,并返回标准输出的切片 func (c *Cmd) CombinedOutput() ([]byte, error) //执行Cmd中包含的命令,并返回标准输出与标准错误合并后的切片 func (c *Cmd) StdinPipe() (io.WriteCloser, error) //返回一个管道,该管道会在Cmd中的命令被启动后连接到其标准输入 func (c *Cmd) StdoutPipe() (io.ReadCloser, error) //返回一个管道,该管道会在Cmd中的命令被启动后连接到其标准输出 func (c *Cmd) StderrPipe() (io.ReadCloser, error) //返回一个管道,该管道会在Cmd中的命令被启动后连接到其标准错误

2|0二、案例

2|11. 只执行命令,不获取结果

func main() { cmd := exec.Command("ls", "-l", "/Users/liuqingzheng/") err := cmd.Run() if err != nil { fmt.Println("执行命令出错",err) } }

2|22. 执行命令并获取结果

func main() { cmd := exec.Command("ls", "-l", "/Users/liuqingzheng/") res,err:=cmd.CombinedOutput() if err != nil { fmt.Println(err) } fmt.Println(string(res)) } func main() { res,err:= exec.Command("ls", "-l", "/Users/liuqingzheng/").Output() if err != nil { fmt.Println("执行出错:",err) } fmt.Println(string(res)) }

2|33. 执行命令,区分stdout 和 stderr

func main() { cmd := exec.Command("ls", "-l", "/Users/iuqingzheng/*.log") var stdout, stderr bytes.Buffer cmd.Stdout = &stdout // 标准输出 cmd.Stderr = &stderr // 标准错误 err := cmd.Run() outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes()) fmt.Printf("标准输出:\n%s\n标准错误:\n%s\n", outStr, errStr) if err != nil { fmt.Println("执行出错:",err) } }

2|44. 使用管道,多条命令组合

// ps aux | grep redis func main() { c1 := exec.Command("ps", "aux") // 命令1 c2 := exec.Command("grep", "redis") // 命令2 c2.Stdin, _ = c1.StdoutPipe() // c1的输出,作为c2.输入 c2.Stdout = os.Stdout // c2的输出到控制台上 _ = c2.Start() // c2立即启动,不等结果返回 _ = c1.Run() // c1阻塞直到命令执行完成 _ = c2.Wait() //c2阻塞直到Cmd中的命令执行完成 }

2|55. 设置程序级别的环境变量

func main() { os.Setenv("name", "lqz") //cmd := exec.Command("echo", os.ExpandEnv("$name")) cmd := exec.Command("echo", os.ExpandEnv("$name")) out, err := cmd.CombinedOutput() if err != nil { fmt.Println("执行出错:",err) } fmt.Printf("%s", out) } //ExpandEnv根据当前环境变量的值来替换字符串中的${var}或者$var。如果引用变量没有定义,则用空字符串替换 s := "hello $GOROOT" fmt.Println(os.ExpandEnv(s))

__EOF__

本文作者BigSun丶
本文链接https://www.cnblogs.com/Mcoming/p/18073086.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   BigSun丶  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示