Go程序例子(80):生成进程
Go程序例子(80):生成进程
有时候我们的Go程序需要生成其他非Go的进程。代码语言:go复制package main
import (
"fmt"
"io"
"os/exec"
)
func main() {
// 我们将从一个简单的命令开始,这个命令不需要任何参数或输入,只是向标准输出打印一些内容。e
Go程序例子(80):生成进程
有时候我们的Go程序需要生成其他非Go的进程。
代码语言:go复制package main
import (
"fmt"
"io"
"os/exec"
)
func main() {
// 我们将从一个简单的命令开始,这个命令不需要任何参数或输入,只是向标准输出打印一些内容。exec.Command辅助函数创建了一个对象来代表这个外部进程。
dateCmd := exec.Command("date")
// Output方法执行命令,等待其完成并收集其标准输出。如果没有错误,dateOut将保存包含日期信息的字节。
dateOut, err := dateCmd.Output()
if err != nil {
panic(err)
}
fmt.Println("> date")
fmt.Println(string(dateOut))
// 如果执行命令时出现问题(例如路径错误),Output和Command的其他方法将返回exec.Error;如果命令运行但以非零返回代码退出,则返回exec.ExitError。
_, err = exec.Command("date", "-x").Output()
if err != nil {
switch e := err.(type) {
case *exec.Error:
fmt.Println("failed executing:", err)
case *exec.ExitError:
fmt.Println("command exit rc =", e.ExitCode())
default:
panic(err)
}
}
// 接下来,我们将探讨一个稍微复杂一些的场景,在这个场景中,我们将数据通过管道传输到外部进程的标准输入(stdin),并从其标准输出(stdout)收集结果。
grepCmd := exec.Command("grep", "hello")
// 在这里,我们明确地获取了输入/输出管道,启动了进程,向其写入一些输入,读取产生的输出,并最终等待进程退出。
grepIn, _ := grepCmd.StdinPipe()
grepOut, _ := grepCmd.StdoutPipe()
grepCmd.Start()
grepIn.Write([]byte("hello grep\\ngoodbye grep"))
grepIn.Close()
grepBytes, _ := io.ReadAll(grepOut)
grepCmd.Wait()
// 在上面的例子中,我们省略了错误检查,但你可以使用常见的if err != nil模式来处理所有错误。我们也只收集了StdoutPipe的结果,但你完全可以用同样的方式收集StderrPipe。
fmt.Println("> grep hello")
fmt.Println(string(grepBytes))
// 请注意,在生成命令时,我们需要提供一个明确划分的命令和参数数组,而不是能够直接传入一个命令行字符串。如果你想用一个字符串生成一个完整的命令,你可以使用bash的-c选项:
lsCmd := exec.Command("bash", "-c", "ls -a -l -h")
lsOut, err := lsCmd.Output()
if err != nil {
panic(err)
}
fmt.Println("> ls -a -l -h")
fmt.Println(string(lsOut))
}
运行结果:
代码语言:javascript代码运行次数:0运行复制➜ go run spawning-processes.go
> date
2025年 1月21日 星期二 09时42分07秒 CST
command exit rc = 1
> grep hello
hello grep
> ls -a -l -h
total 8
drwxr-xr-x lazy staff 96B 1 21 09:41 .
drwxr-xr-x 47 lazy staff 1.5K 1 21 09:41 ..
-rw-r--r-- 1 lazy staff 2.K 1 21 09:41 spawning-processes.go
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-20 17:24:35
推荐阅读
留言与评论(共有 6 条评论) |
本站网友 苏州家具城 | 24分钟前 发表 |
Go程序例子(80):生成进程 有时候我们的Go程序需要生成其他非Go的进程 | |
本站网友 曹远征 | 0秒前 发表 |
dateOut | |
本站网友 上海酒吧网 | 8分钟前 发表 |
= exec.Command("date") // Output方法执行命令 | |
本站网友 骏景花园租房 | 0秒前 发表 |
你可以使用bash的-c选项: lsCmd | |
本站网友 峨眉酒家 | 15分钟前 发表 |
= exec.Command("date") // Output方法执行命令 |