让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()
  }

Ubuntu 安装Go语言包

《Go语言编程》高清完整版电子书

Go语言并行之美 -- 超越 “Hello World”

我为什么喜欢Go语言

  • 1
  • 2
  • 3
  • 下一页

相关内容