golang执行命令操作 exec.Command
我就废话不多说了,大家还是直接看代码吧~
cmd:=exec.Command("cmd")
in:=bytes.NewBuffer(nil)
cmd.Stdin=in//绑定输入
varoutbytes.Buffer
cmd.Stdout=&out//绑定输出
gofunc(){
in.WriteString("nodeE:/design/test.js\n")//写入你的命令,可以有多行,"\n"表示回车
}()
err=cmd.Start()
iferr!=nil{
log.Fatal(err)
}
log.Println(cmd.Args)
err=cmd.Wait()
iferr!=nil{
log.Printf("Commandfinishedwitherror:%v",err)
}
fmt.Println(out.String())
补充:golang执行外部命令超时处理exec.CommandContext
使用exec.CommandContext来处理外部命令的超时
funcmain(){
timeout:=5
ctx,cancel:=context.WithTimeout(context.Background(),time.Duration(timeout+5)*time.Second)
defercancel()
cmdarray:=[]string{"-c",fmt.Sprintf("%s%s","sleep","10")}
cmd:=exec.CommandContext(ctx,"bash",cmdarray...)
out,err:=cmd.CombinedOutput()
//ifctx.Err()==context.DeadlineExceeded{}
fmt.Printf("ctx.Err:[%v]\n",ctx.Err())
fmt.Printf("error:[%v]\n",err)
fmt.Printf("out:[%s]\n",string(out))
}
运行结果是:
ctx.Err:[contextdeadlineexceeded] error:[signal:killed] out:[]
如果是一个命令错误输出是什么:
下面这个例子是使用sleep不带参数,显示是错误的。
cmdarray:=[]string{"-c",fmt.Sprintf("%s%s","sleep","")}
ctx.Err:[] error:[exitstatus1] out:[usage:sleepseconds ]
可以命令的执行错误不会导致ctx.Err()错误。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。