繁体   English   中英

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

[英]How to directly invoke the system shell in Go (golang)?

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

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

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

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

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?

第二个参数应该是一个字符串。 在 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)                                                                                                                                                      
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM