概念簡介
有時,我們的 Go 程序需要生成其他的,非 Go 進程。例如,這個
網站的語法高亮是通過在 Go 程序中生成一個pygmentize
來實現的。
讓我們看一些關於 Go 生成進程的例子。
例程代碼
package main
import "fmt"
import "io/ioutil"
import "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))
// 下麵我們將看看一個稍複雜的例子,我們將從外部進程的
// `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, _ := ioutil.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))
}
執行&輸出
# 生成的程序返回和我們直接通過命令行運行這些程序的輸出是相同的。
$ go run spawning-processes.go
> date
Wed Oct 10 09:53:11 PDT 2012
> grep hello
hello grep
> ls -a -l -h
drwxr-xr-x 4 mark 136B Oct 3 16:29 .
drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..
-rw-r--r-- 1 mark 1.3K Oct 3 16:28 spawning-processes.go
課程導航
學習上一篇:Go語言教程:環境變量 學習下一篇:Go語言教程:執行進程
相關資料
本例程github源代碼:https://github.com/xg-wang/gobyexample/blob/master/examples/spawning-processes