如何在Go中管几个命令? [英] How to pipe several commands in Go?
本文介绍了如何在Go中管几个命令?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
退出状态1
。b
$ b $ i $
log
os
os / exec
)
func main(){
c1:= exec.Command(ls)
stdout1,err:= c1.StdoutPipe()
if err! = nil {
log.Fatal(err)
}
if err = c1.Start(); err!= nil {
log.Fatal(err)
}
if err = c1.Wait(); err!= nil {
log.Fatal(err)
}
c2:= exec.Command(wc,-l)
c2。 Stdin = stdout1
stdout2,err:= c2.StdoutPipe()
if err!= nil {
log.Fatal(err)
}
if err = c2.Start(); err!= nil {
log.Fatal(err)
}
if err = c2.Wait(); err!= nil {
log.Fatal(err)
}
io.Copy(os.Stdout,stdout2)
}
解决方案
StdoutPipe返回一个连接到命令命令启动时
标准输出。在Wait看到命令退出后,管道将自动关闭
。
(from http://golang.org/pkg/os/exec/#Cmd.StdinPipe )
你做的事实
c1.Wait
关闭stdoutPipe
。
我做了一个工作示例(只是一个演示,添加错误捕获!):
package main
import(
bytes
io
os
os / exec
)
func main(){
c1:= exec.Command(ls)
c2:= exec.Command(wc,-l)
r,w:= io.Pipe()
c1.Stdout = w
c2.Stdin = r
var b2 bytes.Buffer
c2 .Stdout =& b2
c1.Start()
c2.Start()
c1.Wait()
w.Close()
c2.Wait()
io.Copy(os.Stdout,& b2)
}
How can I pipe several external commands together in Go? I've tried this code but I get an error that says
exit status 1
.package main import ( "io" "log" "os" "os/exec" ) func main() { c1 := exec.Command("ls") stdout1, err := c1.StdoutPipe() if err != nil { log.Fatal(err) } if err = c1.Start(); err != nil { log.Fatal(err) } if err = c1.Wait(); err != nil { log.Fatal(err) } c2 := exec.Command("wc", "-l") c2.Stdin = stdout1 stdout2, err := c2.StdoutPipe() if err != nil { log.Fatal(err) } if err = c2.Start(); err != nil { log.Fatal(err) } if err = c2.Wait(); err != nil { log.Fatal(err) } io.Copy(os.Stdout, stdout2) }
解决方案StdoutPipe returns a pipe that will be connected to the command's standard output when the command starts. The pipe will be closed automatically after Wait sees the command exit.
(from http://golang.org/pkg/os/exec/#Cmd.StdinPipe )
The fact you do
c1.Wait
closes thestdoutPipe
.I made a working example (just a demo, add error catching!) :
package main import ( "bytes" "io" "os" "os/exec" ) func main() { c1 := exec.Command("ls") c2 := exec.Command("wc", "-l") r, w := io.Pipe() c1.Stdout = w c2.Stdin = r var b2 bytes.Buffer c2.Stdout = &b2 c1.Start() c2.Start() c1.Wait() w.Close() c2.Wait() io.Copy(os.Stdout, &b2) }
这篇关于如何在Go中管几个命令?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文