bash - 如何在 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?
解决方案
第二个参数应该是一个字符串。在 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)
}
推荐阅读
- php - SQL 在同一列中相互减去两行以获得结果
- java - 如何在spring-boot中从application.properties制作配置类?
- windows - 在 Windows 上不使用 Android Studio 或模拟器运行从 vs 代码到物理手机的颤动
- python-3.x - 使用 Pytorch 用神经网络拟合高斯曲线
- asp.net - (Z("onerror="alert`5986267575`")) 部分在 ASP.NET Webforms 中的 URL 之间呈现警报
- rust - 我可以从异步函数初始化 `thread_local` 吗?
- swift - 如何在不下拉的情况下激活刷新控制(Swift)
- sql - 如何在 Oracle 中批量收集到自定义类型的表中
- algorithm - 以一种方式对数据进行排序,但以另一种方式检索
- typescript - 防止相同类型的打字稿转换