让Go语言调用外部程序时支持管道符

有一个需求是用go语言程序调用外部命令时,允许使用管道符,如 ls | wc -l

Go语言对外部命令的调用进行了一定的封装,下面来试一下:

  package main
  
  import (
   "os"
   "os/exec"
  )
  
  func main() {
   run1()
  }
  
  func run1() {
   cmd := exec.Command("ls", "|", "wc", "-l")
       cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr
   cmd.Start()
   cmd.Run()
   cmd.Wait()
  }

  这样执行时,控制台会打出错误:

  ls: 无法访问|: 没有那个文件或目录

  ls: 无法访问wc: 没有那个文件或目录

  难道Go程序不能使用管道符命令吗?带这此问题,我查了大量的资料,终于发现应该这样写:

  package main
  
  import (
   "os"
   "os/exec"
  )
  
  func main() {
   run1()
   run2()
  }
  
  func run1() {
   cmd := exec.Command("ls", "|", "wc", "-l")
   cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr
   cmd.Start()
   cmd.Run()
   cmd.Wait()
  }
  
  func run2() {
   c1 := exec.Command("ls")
   c2 := exec.Command("wc", "-l")
   c2.Stdin, _ = c1.StdoutPipe()
   c2.Stdout = os.Stdout
   c2.Stderr = os.Stderr
   c2.Start()
   c1.Run()
   c2.Wait()
  }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/e05b34768ecd37fbd563c20d0137b684.html