/*
go进程触发
有的时候 我们需要从go程序里面触发一个其他的非go进程来执行
*/
package main
import (
"fmt"
"io/ioutil"
"os/exec"
)
func main() {
/*
我们从一个简单的命令开始这个命令不需要任务参数
或者输入 仅仅向stdout输出一些信息
exec.Command
函数创建了一个代表外部进程的对象
*/
dateCmd := exec.Command("date")
/*
Output是另一个运行命令时用来处理信息的函数
这个函数等待命令结束 然后收集命令输出 如果没有错误
发生的话 dataOut将保存date的信息
*/
dateOut, err := dateCmd.Output()
if err != nil {
panic(err)
}
fmt.Println("> date")
fmt.Println(string(dateOut))
/*
来看一个需要从stdin输入数据的命令
我们将数据输入传给外部进程的stdin
然后从它输出到stdout的运行结果收集信息
*/
grepCmd := exec.Command("grep", "hello")
/*
这里我们显示地获取input output管道 启动进程
*/
grepIn, _ := grepCmd.StdinPipe()
grepOut, _ := grepCmd.StdoutPipe()
grepCmd.Start()
grepIn.Write([]byte("hello grep\ngoodbye grep"))
grepIn.Close()
grepBytes, _ := ioutil.ReadAll(grepOut)
grepCmd.Wait()
fmt.Println(">grep hello")
fmt.Println(string(grepBytes))
lsCmd := exec.Command("bash", "-c", "ls -a -l -h")
lsOut, err := lsCmd.Output()
if err != nil {
panic(err)
}
fmt.Println("> ;s -a -l -h")
fmt.Println(string(lsOut))
}