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

gojuukaze · 2019-09-12 15:52:25 · 454626 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-09-12 15:52:25 的主题,其中的信息可能已经有所发展或是发生改变。

原文链接 : https://www.ikaze.cn/article/44


在go中我们想执行带管道的命令时(如:ps aux|grep go),不能直接像下面这样:

exec.Command("ps", "aux", "|", "grep", "go")

这样做不会有任何输出。

有两种方法可以做到:

  1. 使用 sh -c ""命令

    exec.Command("bash", "-c", "ps aux|grep go")
    

    这是推荐的做法。
    如果输出不是很多,推荐使用github.com/go-cmd/cmd库来执行系统命令,如:

    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()连接两个命令

    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

454626 次点击  
加入收藏 微博
4 回复  |  直到 2024-11-01 09:49:02
xiangbei
xiangbei · #1 · 3年之前

如何只抛出执行命令,不等待返回结果呢?

EddyLee1010
EddyLee1010 · #2 · 3年之前
xiangbeixiangbei #1 回复

如何只抛出执行命令,不等待返回结果呢?

异步啊。等什么

YuPeng
YuPeng · #3 · 大约1年之前
xiangbeixiangbei #1 回复

如何只抛出执行命令,不等待返回结果呢?

cmd 有个start方法不用等待 https://pkg.go.dev/os/exec#Cmd.Start

mengmeng
mengmeng · #4 · 5月之前

thanks a lot by XJD

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传