簡體   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