根据 golang 文档,当您使用 exec.Command() 时,go 不会调用系统的 shell。


来自“os/exec”包的 golang.org 文档:


与来自 C 和其他语言的“系统”库调用不同,os/exec 包有意不调用系统 shell,也不扩展任何 glob 模式或处理通常由 shell 完成的其他扩展、管道或重定向。


这提出了一个问题。由于这种设计选择,您在执行命令时不能使用管道。因此,以下代码不会按需要执行。


package main


import (

        "fmt"

        "os/exec"

)


func main() {

        exec.Command("echo", "Hello", ">>", "~/thing").Run()

        cmdOut, _ := exec.Command("cat", "~/thing").Output()


        fmt.Println(cmdOut)

}

它不是打印出应该包含单词“Hello”的文件的内容,而是打印出一个空白的换行符。我试过像这样直接调用bash:


package main


import (

        "fmt"

        "os/exec"

)


func main() {

        exec.Command("bash", "-c", "echo", "Hello", ">>", "~/thing").Run()

        cmdOut, _ := exec.Command("cat", "~/thing").Output()


        fmt.Println(cmdOut)

}



但是,这会产生与原始代码相同的结果。使用golang时如何直接调用系统shell?