根据 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?