原文链接 : https://www.ikaze.cn/article/44
在go中我们想执行带管道的命令时(如:ps aux|grep go
),不能直接像下面这样:
exec.Command("ps", "aux", "|", "grep", "go")
这样做不会有任何输出。
有两种方法可以做到:
-
使用
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)
-
使用
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 = &bufferps.Start()
grep.Start()ps.Wait()
w.Close()
grep.Wait()io.Copy(os.Stdout, &buffer)
第二种方法非常不方便,而且无法使用
grep.Stdout()
,grep.StdoutPipe()
获取输出
这是一个从 https://studygolang.com/topics/10056 下的原始话题分离的讨论话题