有一個需求是用go語言程序調用外部命令時,允許使用管道符,如 ls | wc -l
Go語言對外部命令的調用進行了一定的封裝,下面來試一下:
package main
import (
"os"
"os/exec"
)
func main() {
run1()
}
func run1() {
cmd := exec.Command("ls", "|", "wc", "-l")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Start()
cmd.Run()
cmd.Wait()
}
這樣執行時,控制台會打出錯誤:
ls: 無法訪問|: 沒有那個文件或目錄
ls: 無法訪問wc: 沒有那個文件或目錄
難道Go程序不能使用管道符命令嗎?帶這此問題,我查了大量的資料,終於發現應該這樣寫:
package main
import (
"os"
"os/exec"
)
func main() {
run1()
run2()
}
func run1() {
cmd := exec.Command("ls", "|", "wc", "-l")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Start()
cmd.Run()
cmd.Wait()
}
func run2() {
c1 := exec.Command("ls")
c2 := exec.Command("wc", "-l")
c2.Stdin, _ = c1.StdoutPipe()
c2.Stdout = os.Stdout
c2.Stderr = os.Stderr
c2.Start()
c1.Run()
c2.Wait()
}