### [原文链接](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()`获取输出