今天我们讲os/exec包,这个我就不废话了

(1)func LookPath(file string) (f string, err error)这个是搜索可执行的二进制的文件的路径,返回的是执行路径和error

  1. import (
  2. "fmt"
  3. "os/exec"
  4. )
  5. func main() {
  6. f, err := exec.LookPath("php")
  7. if err != nil {
  8. fmt.Println("not install php")
  9. }
  10. fmt.Println(f) // 输出我的phpD:\PHP\\php.exe
  11. }

(2)type Cmd

  1. type Cmd struct {
  2. Path string
  3. Args []string
  4. Env []string
  5. Dir string
  6. Stdin io.Reader
  7. Stdout io.Writer
  8. Stderr io.Writer
  9. ExtraFiles []*os.File
  10. SysProcAttr *syscall.SysProcAttr
  11. Process *os.Process
  12. ProcessState *os.ProcessState
  13. }

[1]func Command(name string, arg …string) Cmd 输入文件的路径,参数字符串,返回的是Cmd的结构上边的结构

  1. import (
  2. "fmt"
  3. "os/exec"
  4. )
  5. func main() {
  6. argv := []string{"-a"}
  7. c := exec.Command("ls", argv...)
  8. d, _ := c.Output()
  9. fmt.Println(string(d)) //因为装的git bash所以可以用ls -a
  10. /*
  11. * .
  12. * ..
  13. * command.go
  14. * lookpath.go
  15. */
  16. }

[2]func (c *Cmd) CombinedOutput() ([]byte, error)这个函数返回标准输出和错误

  1. import (
  2. "fmt"
  3. "os/exec"
  4. )
  5. func main() {
  6. arv := []string{"-a"}
  7. c := exec.Command("ls", arv...)
  8. d, err := c.CombinedOutput()
  9. if err != nil {
  10. fmt.Println(err)
  11. }
  12. fmt.Println(string(d)) //输出和command里边的output一样哈
  13. }

[3]func (c *Cmd) Output() ([]byte, error)我们第一次就使用了,返回标准的输出

  1. import (
  2. "fmt"
  3. "os/exec"
  4. )
  5. func main() {
  6. c, err := exec.Command("date").Output()
  7. if err != nil {
  8. fmt.Println(err)
  9. }
  10. fmt.Println(string(c)) // Sat Jan 4 17:07:36 2014 这个是标准库里的例子
  11. }

[4]func (c Cmd) Run() error这个函数主要是执行Cmd中的命令,并且会等待命令执行完成,如果命令执行不成功,则返回错误信息

  1. import (
  2. "fmt"
  3. "os/exec"
  4. )
  5. func main() {
  6. c, err := exec.Command("date")
  7. if err != nil {
  8. fmt.Println(err)
  9. }
  10. err = c.Run()
  11. if err != nil {
  12. fmt.Println(err)
  13. }
  14. d, _ := c.Output()
  15. fmt.Println(string(d)) // Sat Jan 4 17:07:36
  16. }

[5]func (c Cmd) Start() error这个函数主要是执行Cmd中的命令,只是让命令开始执行,并不会等待命令执行完。

[6]func (c *Cmd) Wait() error 这个函数是等待函数执行完成

  1. import (
  2. "fmt"
  3. "os/exec"
  4. )
  5. func main() {
  6. //官方的标准库的例子
  7. cmd := exec.Command("sleep", "5") //执行等待5秒
  8. err := cmd.Start() //开始执行
  9. if err != nil {
  10. fmt.Printf("Error: %s\n", err)
  11. return
  12. }
  13. fmt.Printf("Waiting for command to finish...\n")
  14. err = cmd.Wait() //wait下边的函数等待执行完成
  15. fmt.Printf("Command finished with error: %v\n", err)
  16. }

[7]func (c *Cmd) StderrPipe() (io.ReadCloser, error)这个函数主要是用于连接到命令启动时错误标准输出的管道,命令结束时,管道会自动关闭

  1. import (
  2. "fmt"
  3. "io/ioutil"
  4. "os/exec"
  5. )
  6. func main() {
  7. c := exec.Command("mv", "hello")
  8. i, err := c.StderrPipe()
  9. if err != nil {
  10. fmt.Printf("Error: %s\n", err)
  11. return
  12. }
  13. if err = c.Start(); err != nil {
  14. fmt.Printf("Error: %s\n", err)
  15. }
  16. b, _ := ioutil.ReadAll(i)
  17. if err := c.Wait(); err != nil {
  18. fmt.Printf("Error: %s\n", err) //Error: exit status 1 mv: missing file argument Try `mv --help' for more information.
  19. }
  20. fmt.Println(string(b))
  21. }

[8]func (c *Cmd) StdinPipe() (io.WriteCloser, error)这个函数主要是用于连接到命令启动时标准输入的管道

  1. import (
  2. "bytes"
  3. "fmt"
  4. "os/exec"
  5. )
  6. func main() {
  7. var output bytes.Buffer
  8. cmd := exec.Command("cat")
  9. cmd.Stdout = &output
  10. stdin, _ := cmd.StdinPipe()
  11. cmd.Start() //执行开始
  12. stdin.Write([]byte("widuu test"))
  13. stdin.Close()
  14. cmd.Wait() //等待执行完成
  15. fmt.Printf("The output is: %s\n", output.Bytes()) //The output is: widuu test!
  16. }

[9]有输入就有输出 func (c *Cmd) StdoutPipe() (io.ReadCloser, error)

  1. import (
  2. "fmt"
  3. "io/ioutil"
  4. "os/exec"
  5. )
  6. func main() {
  7. cmd := exec.Command("ls", "-ll")
  8. stdout, _ := cmd.StdoutPipe()
  9. cmd.Start()
  10. d, _ := ioutil.ReadAll(stdout) //从管道里读取数据
  11. cmd.Wait()
  12. fmt.Println(string(d))
  13. /*
  14. total 5
  15. -rw-r--r-- 1 Administ Administ 268 Jan 4 17:07 combinedoutput.go
  16. -rw-r--r-- 1 Administ Administ 277 Jan 4 17:01 command.go
  17. -rw-r--r-- 1 Administ Administ 209 Jan 4 16:46 lookpath.go
  18. -rw-r--r-- 1 Administ Administ 241 Jan 4 17:07 output.go
  19. -rw-r--r-- 1 Administ Administ 271 Jan 4 17:13 run.go
  20. -rw-r--r-- 1 Administ Administ 438 Jan 4 17:24 start.go
  21. -rw-r--r-- 1 Administ Administ 497 Jan 4 17:32 stderrpipe.go
  22. -rw-r--r-- 1 Administ Administ 552 Jan 6 14:10 stdinpipe.go
  23. -rw-r--r-- 1 Administ Administ 235 Jan 6 14:14 stdoutpipe.go
  24. */
  25. }

(3)type Error结构是

  1. type Error struct {
  2. Name string
  3. Err error
  4. }

[1]func (e *Error) Error() string这个函数主要是输出命令执行失败的错误信息

  1. import (
  2. "errors"
  3. "fmt"
  4. "os/exec"
  5. )
  6. func main() {
  7. err := &exec.Error{
  8. Name: "widuu",
  9. Err: errors.New("is not exists widuu"),
  10. }
  11. fmt.Println(err.Error()) // exec: "widuu": is not exists widuu
  12. }

(4)type ExitError

  1. type ExitError struct {
  2. *os.ProcessState
  3. }

[1]func (e *ExitError) Error() string 这个函数主要是返回一个执行不成功命令的信息

  1. import (
  2. "fmt"
  3. "os/exec"
  4. )
  5. func main() {
  6. cmd := exec.Command("mv", "Hello World!")
  7. cmd.Run()
  8. exitError := exec.ExitError{cmd.ProcessState}
  9. fmt.Printf("The output is: %s\n", exitError.Error()) //The output is: exit status 1
  10. }

这里我们exec包就讲完了,本文首发在我的博客,如果您喜欢可以随时关注我的博客微度网络-网络技术中心http://www.widuu.com