go使用exec.Command执行带管道的命令

gojuukaze · · 308203 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

### [原文链接](https://www.ikaze.cn/article/44) : https://www.ikaze.cn/article/44 --- 在go中我们想执行带管道的命令时(如:`ps aux|grep go`),不能直接像下面这样: ```go exec.Command("ps", "aux", "|", "grep", "go") ``` 这样做不会有任何输出。 有两种方法可以做到: 1. 使用 `sh -c ""`命令 ```go exec.Command("bash", "-c", "ps aux|grep go") ``` 这是推荐的做法。 如果输出不是很多,推荐使用`github.com/go-cmd/cmd`库来执行系统命令,如: ```go import "github.com/go-cmd/cmd" c := cmd.NewCmd("bash", "-c", "ps aux|grep go") <-c.Start() fmt.Println(c.Status().Stdout) ``` 2. 使用`io.Pipe()`连接两个命令 ```go ps := exec.Command("ps", "aux") grep := exec.Command("grep", "go") r, w := io.Pipe() // 创建一个管道 defer r.Close() defer w.Close() ps.Stdout = w // ps向管道的一端写 grep.Stdin = r // grep从管道的一端读 var buffer bytes.Buffer grep.Stdout = &buffer ps.Start() grep.Start() ps.Wait() w.Close() grep.Wait() io.Copy(os.Stdout, &buffer) ``` 第二种方法非常不方便,而且无法使用`grep.Stdout()`,`grep.StdoutPipe()`获取输出

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

308203 次点击  
加入收藏 微博
4 回复  |  直到 2024-11-01 09:49:02
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传