package main
import (
"bytes"
"fmt"
"io/ioutil"
"os/exec"
)
func main() {
//搜索可执行的二进制文件路径
f, err := exec.LookPath("php")
fmt.Println(f, err)
argv := []string{"php"}
c := exec.Command("which", argv...) //执行一个shell命令
d, _ := c.Output() //将*exec.Cmd标准输出为[]byte
fmt.Println(string(d)) //就是输出刚才命令行执行的打印输出
c2 := exec.Command("pwd", "-L") //执行一个shell命令
d, err = c2.CombinedOutput() //和上面的Output一样的
fmt.Println(string(d), err, "11111")
c3 := exec.Command("date")
err = c3.Run() //会执行*Cmd中的命令,并等待命令执行完成
if err != nil {
fmt.Println(err)
}
d2, _ := c3.Output() //Cmd标准输出,测试的为毛没输出
fmt.Println(string(d2), "为毛没输出")
cmd := exec.Command("sleep", "5") //执行等待5秒
err = cmd.Start() //开始执行,不会等待命令执行完成
fmt.Println(err, "cmd.Start()不会等待命令执行完")
err = cmd.Wait()
fmt.Println("cmd.Wait()会等待上面的执行完了再执行Wait之后的")
//打印命令行的输入
var output bytes.Buffer
cmd2 := exec.Command("cat")
cmd2.Stdout = &output
stdin, _ := cmd2.StdinPipe() //连接到命令启动时标准输入的管道
cmd2.Start()
stdin.Write([]byte("hello world"))
stdin.Close()
cmd2.Wait()
fmt.Println(string(output.Bytes()))
//打印命令行的输出
cmd3 := exec.Command("ls", "-ll")
stdout, _ := cmd3.StdoutPipe() //输出刚才命令行的打印
cmd3.Start() //开始执行
dd, _ := ioutil.ReadAll(stdout) //从管道里读取数据
cmd.Wait() //等待命令执行完
fmt.Println(string(dd))
}