我有一个名为myApp
的简单Go应用程序,该应用程序应在macOS上启动一个新的Terminal窗口:
package main
import (
"fmt"
"os/exec"
)
func main() {
err := exec.Command("open", "-a", "Terminal", "/Users/ns/go/").Run()
if err != nil {
fmt.Println(err)
}
}
但是,当我运行该应用程序时,我得到以下输出:
ns:~/go/src/github.com/nevadascout/myApp $ go install && myApp
exit status 1
如果我在终端中手动运行命令(open -a Terminal /Users/ns/go/
),它将起作用。
我想念什么?
答案 0 :(得分:1)
来自docs:
与使用C和其他语言进行的“系统”库调用不同,os / exec软件包有意不调用系统外壳程序,也不扩展任何glob模式或处理其他通常由外壳程序完成的扩展,管道或重定向。程序包的行为更像C的“ exec”函数系列。要扩展glob模式,请直接调用外壳程序,注意避免任何危险的输入,或者使用path / filepath包的Glob函数。要扩展环境变量,请使用软件包os的ExpandEnv。
因此,您需要运行bash -c
命令并将上述命令作为参数传递。像这样:
exec.Command("bash", "-c", "open", "-a", "Terminal", "~/go/").Run()
对于Windows,您应该使用cmd /C
。示例:
exec.Command("cmd", "/C", ...)