Go – Pipe 3 or more commands with os.exec()?

huangapple go评论100阅读模式
英文:

Go - Pipe 3 or more commands with os.exec()?

问题

你可以使用Go语言中的io.Pipe()函数来实现管道连接多个命令。下面是一个示例代码:

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. "os/exec"
  7. )
  8. func main() {
  9. cmd1 := exec.Command("ls")
  10. cmd2 := exec.Command("grep", "example")
  11. cmd3 := exec.Command("wc", "-l")
  12. // 创建管道
  13. pipeReader, pipeWriter := io.Pipe()
  14. // 将cmd1的输出连接到pipeWriter
  15. cmd1.Stdout = pipeWriter
  16. // 将cmd2的输入连接到pipeReader
  17. cmd2.Stdin = pipeReader
  18. // 将cmd2的输出连接到os.Stdout
  19. cmd2.Stdout = os.Stdout
  20. // 将cmd3的输入连接到cmd2的输出
  21. cmd3.Stdin = cmd2.Stdout
  22. // 启动命令
  23. cmd1.Start()
  24. cmd2.Start()
  25. cmd3.Start()
  26. // 等待命令执行完成
  27. cmd1.Wait()
  28. pipeWriter.Close()
  29. cmd2.Wait()
  30. cmd3.Wait()
  31. }

这段代码将会执行ls | grep example | wc -l的命令,并将结果输出到标准输出。你可以根据需要修改命令和参数。

英文:

How can I pipe 3+ commands together in Go (for example ls | grep | wc)? I've tried to modify this code that is for piping 2 commands, but can't figure out the correct way.,

  1. package main
  2. import (
  3. "os"
  4. "os/exec"
  5. )
  6. func main() {
  7. c1 := exec.Command("ls")
  8. c2 := exec.Command("wc", "-l")
  9. c2.Stdin, _ = c1.StdoutPipe()
  10. c2.Stdout = os.Stdout
  11. _ = c2.Start()
  12. _ = c1.Run()
  13. _ = c2.Wait()
  14. }

https://stackoverflow.com/a/10953142/3761308

答案1

得分: 4

  1. package main
  2. import (
  3. "os"
  4. "os/exec"
  5. )
  6. func main() {
  7. c1 := exec.Command("ls")
  8. c2 := exec.Command("grep", "-i", "o")
  9. c3 := exec.Command("wc", "-l")
  10. c2.Stdin, _ = c1.StdoutPipe()
  11. c3.Stdin, _ = c2.StdoutPipe()
  12. c3.Stdout = os.Stdout
  13. _ = c3.Start()
  14. _ = c2.Start()
  15. _ = c1.Run()
  16. _ = c2.Wait()
  17. _ = c3.Wait()
  18. }

这是一个Go语言的代码片段,它使用了os/exec包来执行一系列命令。代码的功能是执行ls命令,然后将输出传递给grep -i o命令,再将输出传递给wc -l命令。最后,将结果输出到标准输出。

英文:
  1. package main
  2. import (
  3. "os"
  4. "os/exec"
  5. )
  6. func main() {
  7. c1 := exec.Command("ls")
  8. c2 := exec.Command("grep", "-i", "o")
  9. c3 := exec.Command("wc", "-l")
  10. c2.Stdin, _ = c1.StdoutPipe()
  11. c3.Stdin, _ = c2.StdoutPipe()
  12. c3.Stdout = os.Stdout
  13. _ = c3.Start()
  14. _ = c2.Start()
  15. _ = c1.Run()
  16. _ = c2.Wait()
  17. _ = c3.Wait()
  18. }

huangapple
  • 本文由 发表于 2016年12月28日 20:13:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/41361929.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定