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

前端之家收集整理的这篇文章主要介绍了让go语言调用外部程序时支持管道符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

  有一个需求是用go语言程序调用外部命令时,允许使用管道符,如ls|wc-l
  Go语言对外部命令的调用进行了一定的封装,下面来试一下:

  1.   package main
  2.   
  3.   import (
  4.    "os"
  5.    "os/exec"
  6.   )
  7.   
  8.   func main() {
  9.    run1()
  10.   }
  11.   
  12.   func run1() {
  13.    cmd := exec.Command("ls","|","wc","-l")
  14.   cmd.Stdout = os.Stdout
  15.    cmd.Stderr = os.Stderr
  16.    cmd.Start()
  17.    cmd.Run()
  18.    cmd.Wait()
  19.   }

  这样执行时,控制台会打出错误
  ls:无法访问|:没有那个文件或目录
  ls:无法访问wc:没有那个文件或目录


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

  1.   package main
  2.   
  3.   import (
  4.    "os"
  5.    "os/exec"
  6.   )
  7.   
  8.   func main() {
  9.    run1()
  10.    run2()
  11.   }
  12.   
  13.   func run1() {
  14.    cmd := exec.Command("ls","-l")
  15.    cmd.Stdout = os.Stdout
  16.    cmd.Stderr = os.Stderr
  17.    cmd.Start()
  18.    cmd.Run()
  19.    cmd.Wait()
  20.   }
  21.   
  22.   func run2() {
  23.    c1 := exec.Command("ls")
  24.    c2 := exec.Command("wc","-l")
  25.    c2.Stdin,_ = c1.StdoutPipe()
  26.    c2.Stdout = os.Stdout
  27.    c2.Stderr = os.Stderr
  28.    c2.Start()
  29.    c1.Run()
  30.    c2.Wait()
  31.   }

  哈哈,这样就没问题啦。

  下面,我们来点高级的,如查询Nginx主进行的PID号:
  ps-eaf|grep"Nginx:master"|grep-v"grep"|awk'{print$2}'

  1.   package main
  2.   
  3.   import (
  4.    "os"
  5.    "os/exec"
  6.   )
  7.   
  8.   func main() {
  9.    run1()
  10.    run2()
  11.    run3()
  12.   }
  13.   
  14.   func run1() {
  15.    cmd := exec.Command("ls",_ = c1.StdoutPipe()
  16.    c2.Stdout = os.Stdout
  17.    c2.Stderr = os.Stderr
  18.    c2.Start()
  19.    c1.Run()
  20.    c2.Wait()
  21.   }
  22.   
  23.   func run3() {
  24.    c1 := exec.Command("ps","-eaf")
  25.    c2 := exec.Command("grep",`"Nginx: master"`)
  26.    c3 := exec.Command("grep","-v",`"grep"`)
  27.    c4 := exec.Command("awk",`'{print $2}'`)
  28.    c2.Stdin,_ = c1.StdoutPipe()
  29.    c3.Stdin,_ = c2.StdoutPipe()
  30.    c4.Stdin,_ = c3.StdoutPipe()
  31.   
  32.    c4.Stdout = os.Stdout
  33.    c4.Stderr = os.Stderr
  34.   
  35.    c4.Start()
  36.    c3.Start()
  37.    c2.Start()
  38.    c1.Run()
  39.    c4.Wait()
  40.   }

  靠,又不行了,提示
  awk:1:unexpectedcharacter'''
  awk:1:unexpectedcharacter'''
  它不能支持参数中有引号的内容

  怎么办,难道真的没辙了吗?老天不负有心人,终于被我找到解决办法了,而且更简单:

  1.   package main
  2.   
  3.   import (
  4.    "os"
  5.    "os/exec"
  6.   )
  7.   
  8.   func main() {
  9.    run1()
  10.    run2()
  11.    run3()
  12.    run4()
  13.   }
  14.   
  15.   func run1() {
  16.    cmd := exec.Command("ls",_ = c3.StdoutPipe()
  17.   
  18.    c4.Stdout = os.Stdout
  19.    c4.Stderr = os.Stderr
  20.   
  21.    c4.Start()
  22.    c3.Start()
  23.    c2.Start()
  24.    c1.Run()
  25.    c4.Wait()
  26.   }
  27.   
  28.   func run4() {
  29.    cmd := exec.Command("/bin/sh","-c",`ps -eaf|grep "Nginx: master"|grep -v "grep"|awk '{print $2}'`)
  30.    cmd.Stdout = os.Stdout
  31.    cmd.Stderr = os.Stderr
  32.    cmd.Start()
  33.    cmd.Run()
  34.    cmd.Wait()
  35.   }

猜你在找的Go相关文章