如何在 Go(golang)中直接调用系统 shell?

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


阿晨1998
浏览 335回答 1
1回答

12345678_0001

第二个参数应该是一个字符串。在 shell 命令中,您也需要将其作为一个字符串传递。也~由 bash 解释。你可以放心地假设它sh存在。Bash shell 不是必须的。package main                                                                                                                                                              import (                                                                                                                                                                   "fmt"                                                                                                                                                                     "os/exec"                                                                                                                                                                )                                                                                                                                                                         func main() {                                                                                                                                                              exec.Command("sh", "-c", "echo Hello >> ~/thing").Run()                                                                                                                   cmdOut, _ := exec.Command("sh", "-c", "cat ~/thing").Output()                                                                                                             fmt.Println(cmdOut)                                                                                                                                                      }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go