让go语言调用外部程序时支持管道符
发布时间:2020-12-16 18:59:02 所属栏目:大数据 来源:网络整理
导读:有一个需求是用 go 语言程序调用外部命令时,允许使用管道符,如 ls|wc-l Go 语言对外部命令的调用进行了一定的封装,下面来试一下: package main import ( "os" "os/exec" ) func main() { run1() } func run1() { cmd := exec.Command("ls","|","wc","-l"
有一个需求是用go语言程序调用外部命令时,允许使用管道符,如ls|wc-l
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() } 这样执行时,控制台会打出错误: 难道Go程序不能使用管道符命令吗?带这此问题,我查了大量的资料,终于发现应该这样写: package main import ( "os" "os/exec" ) func main() { run1() run2() } func run1() { cmd := exec.Command("ls","-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() } 哈哈,这样就没问题啦。 下面,我们来点高级的,如查询nginx主进行的PID号: package main import ( "os" "os/exec" ) func main() { run1() run2() run3() } func run1() { cmd := exec.Command("ls",_ = c1.StdoutPipe() c2.Stdout = os.Stdout c2.Stderr = os.Stderr c2.Start() c1.Run() c2.Wait() } func run3() { c1 := exec.Command("ps","-eaf") c2 := exec.Command("grep",`"nginx: master"`) c3 := exec.Command("grep","-v",`"grep"`) c4 := exec.Command("awk",`'{print $2}'`) c2.Stdin,_ = c1.StdoutPipe() c3.Stdin,_ = c2.StdoutPipe() c4.Stdin,_ = c3.StdoutPipe() c4.Stdout = os.Stdout c4.Stderr = os.Stderr c4.Start() c3.Start() c2.Start() c1.Run() c4.Wait() } 靠,又不行了,提示: 怎么办,难道真的没辙了吗?老天不负有心人,终于被我找到解决办法了,而且更简单: package main import ( "os" "os/exec" ) func main() { run1() run2() run3() run4() } func run1() { cmd := exec.Command("ls",_ = c3.StdoutPipe() c4.Stdout = os.Stdout c4.Stderr = os.Stderr c4.Start() c3.Start() c2.Start() c1.Run() c4.Wait() } func run4() { cmd := exec.Command("/bin/sh","-c",`ps -eaf|grep "nginx: master"|grep -v "grep"|awk '{print $2}'`) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Start() cmd.Run() cmd.Wait() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |