os/exec 包提供了执行linux命令的相关接口,主要有如下:

//这个函数主要是用来查询可执行二进制文件的路径
func LookPath(file string) (string, error)

//这个函数主要是用来初始化一个Cmd指针,Path和Args按参数初始化,其他字段执行默认初始化
//初始化后的Cmd用于后续执行run,start等函数
func Command(name string, arg …string) *Cmd

//这个函数主要是执行*Cmd中的命令,把执行结果和错误合并到byte数组中
func (c *Cmd) CombinedOutput() ([]byte, error)

//这个函数主要是执行*Cmd中的命令,返回执行结果,不包含错误信息
func (c *Cmd) Output() ([]byte, error)

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

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

//这个函数主要是用于连接到命令启动时错误标准输出的管道,命令结束时,管道会自动关闭
//这里记得要保证在cmd命令结束前来读取内容,不然会读不到(一般结合Start与Wait来保证)
func (c *Cmd) StderrPipe() (io.ReadCloser, error)

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

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

//这个函数主要是等待*Cmd中的已开始执行的命令执行完成
func (c *Cmd) Wait() error

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

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

//类似于Command,但是多了一个Context
//如果命令没有完成,但是context完成了,则可以终止命令的继续执行
func CommandContext(ctx context.Context, name string, arg …string) *Cmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
具体示例
LookPath()函数

package main

import (
“bytes”
“context”
“errors”
“fmt”
“io/ioutil”
“os/exec”
“time”
)

//LookPath 实例
//执行结果:
//ps is at path: /bin/ps
func lookPath(exe string) {
path, err := exec.LookPath(exe)
if err != nil {
fmt.Println(err)
return
}

fmt.Println(exe, “is at path: “, path)
}

//func Command && CombinedOutput 实例
//执行结果:
//exit status 1
//CombinedOutput Test: mv: rename nofile to hasfile: No such file or directory
func combinedOutput() {
arg := []string{“nofile”, “hasfile”}
cmd := exec.Command(“mv”, arg…)
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Println(err)
}

fmt.Println(“CombinedOutput Test: “, string(out))
}

//func Output 实例
//执行结果:
//exit status 1
//Output Test:
func outPut() {
arg := []string{“nofile”, “hasfile”}
cmd := exec.Command(“mv”, arg…)
out, err := cmd.Output()
if err != nil {
fmt.Println(err)
}

fmt.Println(“Output Test: “, string(out))
}

//func Run 实例
//执行结果:
//Run Test: run cmd successfully!
func run() {
arg := []string{“hello”, “world”}
cmd := exec.Command(“echo”, arg…)
err := cmd.Run()
if err != nil {
fmt.Println(“run cmd error: “, err)
return
}
fmt.Println(“Run Test: run cmd successfully!”)
}

//func Start 实例
//执行结果:
//Start Test: start cmd successfully!(并不会等待10秒,而是立即返回立即打印)
func start() {
cmd := exec.Command(“sleep”, “10”)
err := cmd.Start()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(“Start Test: start cmd successfully!”)
}

//func Wait 实例
//执行结果:
//Start Test: start run cmd!(立即打印)
//Start Test: finish run cmd!(10s后打印)
func wait() {
cmd := exec.Command(“sleep”, “10”)
err := cmd.Start()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(“Start Test: start run cmd!”)
err = cmd.Wait()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(“Start Test: finish run cmd!”)
}

//func StderrPipe 实例
//执行结果:
//exit status 64
//usage: mv [-f | -i | -n] [-v] source target
// mv [-f | -i | -n] [-v] source … directory
func stderrPipe() {
cmd := exec.Command(“mv”, “hello world”)
stderr, err := cmd.StderrPipe()
if err != nil {
fmt.Println(err)
return
}
err = cmd.Start()
if err != nil {
fmt.Println(err)
}
output, err := ioutil.ReadAll(stderr)
if err != nil {
fmt.Println(err)
return
}

if err = cmd.Wait(); err != nil {
fmt.Println(err) //exit status 64
}

fmt.Printf(string(output))
}

//func StdinPipe 实例
//执行结果:
//The output is: Hello World!
func stdinPipe() {
var output bytes.Buffer
cmd := exec.Command(“cat”)
cmd.Stdout = &output
stdin, err := cmd.StdinPipe()
if err != nil {
fmt.Println(err)
return
}
if err = cmd.Start(); err != nil {
fmt.Println(err)
}
stdin.Write([]byte(“Hello World!”))
stdin.Close()
if err = cmd.Wait(); err != nil {
fmt.Println(err)
}

fmt.Println(“The output is: “, string(output.Bytes()))
}

//func StdoutPipe 实例
//执行结果:
//The output is: Hello World!
func stdoutPipe() {
cmd := exec.Command(“echo”, “Hello World!”)
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Println(err)
return
}
if err = cmd.Start(); err != nil {
fmt.Println(err)
}
output, _ := ioutil.ReadAll(stdout)
if err = cmd.Wait(); err != nil {
fmt.Println(err)
}

fmt.Printf(“The output is: %s\n”, output)
}

//func (e *Error) Error 实例
//执行结果:
//exec: “mv”: 无法获取”Hello”的文件状态: 没有那个文件或目录
func eerror() {
e := exec.Error{
Name: “mv”,
Err: errors.New(“无法获取\”Hello\”的文件状态: 没有那个文件或目录”),
}

fmt.Println(e.Error())
}

//func (e *ExitError) Error 实例
//执行结果:
//exit status 64
func exiterror() {
cmd := exec.Command(“mv”, “Hello World!”)
cmd.Run()
exitError := exec.ExitError{cmd.ProcessState, nil}

fmt.Println(exitError.Error())
}

//func CommandContext 实例
//执行结果:
//signal: killed
func contextCommand() {
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
defer cancel()

if err := exec.CommandContext(ctx, “sleep”, “5”).Run(); err != nil {
// This will fail after 100 milliseconds. The 5 second sleep
// will be interrupted.
fmt.Println(err)
}
}

func main() {
lookPath(“ps”)
combinedOutput()
outPut()
run()
start()
wait()
stderrPipe()
stdinPipe()
stdoutPipe()
eerror()
exiterror()
contextCommand()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
参考资料
https://golang.org/pkg/os/exec/

https://github.com/astaxie/gopkg/tree/master/os/exec
————————————————
版权声明:本文为CSDN博主「Mr_buffoon」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mrbuffoon/article/details/88946034

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注