[英]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.