今天我们讲os/exec包,这个我就不废话了
(1)func LookPath(file string) (f string, err error)
这个是搜索可执行的二进制的文件的路径,返回的是执行路径和error
[php]
import (
"fmt"
"os/exec"
)
func main() {
f, err := exec.LookPath("php")
if err != nil {
fmt.Println("not install php")
}
fmt.Println(f) // 输出我的phpD:\PHP\\php.exe
}
[/php]
(2)type Cmd
[php]
type Cmd struct {
Path string
Args []string
Env []string
Dir string
Stdin io.Reader
Stdout io.Writer
Stderr io.Writer
ExtraFiles []*os.File
SysProcAttr *syscall.SysProcAttr
Process *os.Process
ProcessState *os.ProcessState
}
[/php]
[1]func Command(name string, arg ...string) *Cmd
输入文件的路径,参数字符串,返回的是*Cmd的结构上边的结构
[php]
import (
"fmt"
"os/exec"
)
func main() {
argv := []string{"-a"}
c := exec.Command("ls", argv…)
d, _ := c.Output()
fmt.Println(string(d)) //因为装的git bash所以可以用ls -a
/*
* .
* ..
* command.go
* lookpath.go
*/
}
[/php]
[2]func (c *Cmd) CombinedOutput() ([]byte, error)
这个函数返回标准输出和错误
[php]
import (
"fmt"
"os/exec"
)
func main() {
arv := []string{"-a"}
c := exec.Command("ls", arv…)
d, err := c.CombinedOutput()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(d)) //输出和command里边的output一样哈
}
[/php]
[3]func (c *Cmd) Output() ([]byte, error)
我们第一次就使用了,返回标准的输出
[php]
import (
"fmt"
"os/exec"
)
func main() {
c, err := exec.Command("date").Output()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(c)) // Sat Jan 4 17:07:36 2014 这个是标准库里的例子
}
[/php]
[4]func (c *Cmd) Run() error
这个函数主要是执行*Cmd中的命令,并且会等待命令执行完成,如果命令执行不成功,则返回错误信息
[php]
import (
"fmt"
"os/exec"
)
func main() {
c, err := exec.Command("date")
if err != nil {
fmt.Println(err)
}
err = c.Run()
if err != nil {
fmt.Println(err)
}
d, _ := c.Output()
fmt.Println(string(d)) // Sat Jan 4 17:07:36
}
[/php]
[5]func (c *Cmd) Start() error
这个函数主要是执行*Cmd中的命令,只是让命令开始执行,并不会等待命令执行完。
[6]func (c *Cmd) Wait() error
这个函数是等待函数执行完成
[php]
import (
"fmt"
"os/exec"
)
func main() {
//官方的标准库的例子
cmd := exec.Command("sleep", "5") //执行等待5秒
err := cmd.Start() //开始执行
if err != nil {
fmt.Printf("Error: %s\n", err)
return
}
fmt.Printf("Waiting for command to finish…\n")
err = cmd.Wait() //wait下边的函数等待执行完成
fmt.Printf("Command finished with error: %v\n", err)
}
[/php]
[7]func (c *Cmd) StderrPipe() (io.ReadCloser, error)
这个函数主要是用于连接到命令启动时错误标准输出的管道,命令结束时,管道会自动关闭
[php]
import (
"fmt"
"io/ioutil"
"os/exec"
)
func main() {
c := exec.Command("mv", "hello")
i, err := c.StderrPipe()
if err != nil {
fmt.Printf("Error: %s\n", err)
return
}
if err = c.Start(); err != nil {
fmt.Printf("Error: %s\n", err)
}
b, _ := ioutil.ReadAll(i)
if err := c.Wait(); err != nil {
fmt.Printf("Error: %s\n", err) //Error: exit status 1 mv: missing file argument Try `mv –help’ for more information.
}
fmt.Println(string(b))
}
[/php]
[8]func (c *Cmd) StdinPipe() (io.WriteCloser, error)
这个函数主要是用于连接到命令启动时标准输入的管道
[php]
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
var output bytes.Buffer
cmd := exec.Command("cat")
cmd.Stdout = &output
stdin, _ := cmd.StdinPipe()
cmd.Start() //执行开始
stdin.Write([]byte("widuu test"))
stdin.Close()
cmd.Wait() //等待执行完成
fmt.Printf("The output is: %s\n", output.Bytes()) //The output is: widuu test!
}
[/php]
[9]有输入就有输出func (c *Cmd) StdoutPipe() (io.ReadCloser, error)
[php]
import (
"fmt"
"io/ioutil"
"os/exec"
)
func main() {
cmd := exec.Command("ls", "-ll")
stdout, _ := cmd.StdoutPipe()
cmd.Start()
d, _ := ioutil.ReadAll(stdout) //从管道里读取数据
cmd.Wait()
fmt.Println(string(d))
/*
total 5
-rw-r–r– 1 Administ Administ 268 Jan 4 17:07 combinedoutput.go
-rw-r–r– 1 Administ Administ 277 Jan 4 17:01 command.go
-rw-r–r– 1 Administ Administ 209 Jan 4 16:46 lookpath.go
-rw-r–r– 1 Administ Administ 241 Jan 4 17:07 output.go
-rw-r–r– 1 Administ Administ 271 Jan 4 17:13 run.go
-rw-r–r– 1 Administ Administ 438 Jan 4 17:24 start.go
-rw-r–r– 1 Administ Administ 497 Jan 4 17:32 stderrpipe.go
-rw-r–r– 1 Administ Administ 552 Jan 6 14:10 stdinpipe.go
-rw-r–r– 1 Administ Administ 235 Jan 6 14:14 stdoutpipe.go
*/
}
[/php]
(3)type Error结构是
[php]
type Error struct {
Name string
Err error
}
[/php]
[1]func (e *Error) Error() string
这个函数主要是输出命令执行失败的错误信息
[php]
import (
"errors"
"fmt"
"os/exec"
)
func main() {
err := &exec.Error{
Name: "widuu",
Err: errors.New("is not exists widuu"),
}
fmt.Println(err.Error()) // exec: "widuu": is not exists widuu
}
[/php]
(4)type ExitError
[php]
type ExitError struct {
*os.ProcessState
}
[/php]
[1]func (e *ExitError) Error() string
这个函数主要是返回一个执行不成功命令的信息
[php]
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("mv", "Hello World!")
cmd.Run()
exitError := exec.ExitError{cmd.ProcessState}
fmt.Printf("The output is: %s\n", exitError.Error()) //The output is: exit status 1
}
[/php]
这里我们exec包就讲完了,本文首发在我的博客,如果您喜欢可以随时关注我的博客
未经允许,不得转载本站任何文章:微度网络 » golang讲解(go语言)标准库分析之os/exec
有疑问加站长微信联系(非本文作者)