【问题标题】:How to directly invoke the system shell in Go (golang)?如何在Go(golang)中直接调用系统shell?
【发布时间】:2020-07-08 16:26:58
【问题描述】:

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

【问题讨论】:

    标签: bash go command-line pipe system-calls


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-07-09
      • 2013-03-17
      • 1970-01-01
      • 2021-12-08
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多