为了账号安全,请及时绑定邮箱和手机立即绑定

尝试从Go程序中启动外部编辑器

尝试从Go程序中启动外部编辑器

Go
守候你守候我 2021-05-05 10:58:01
我试图弄清楚如何从Go程序中启动外部编辑器,等待用户关闭编辑器,然后继续执行程序。基于这个答案,我目前有以下代码:package mainimport (    "log"    "os"    "os/exec")func main() {    fpath := os.TempDir() + "/thetemporaryfile.txt"    f, err := os.Create(fpath)    if err != nil {        log.Printf("1")        log.Fatal(err)    }    f.Close()    cmd := exec.Command("vim", fpath)    err = cmd.Start()    if err != nil {        log.Printf("2")        log.Fatal(err)    }    err = cmd.Wait()    if err != nil {        log.Printf("Error while editing. Error: %v\n", err)    } else {        log.Printf("Successfully edited.")    }}当我运行程序时,得到以下信息:chris@DPC3:~/code/go/src/launcheditor$ go run launcheditor.go 2012/08/23 10:50:37 Error while editing. Error: exit status 1chris@DPC3:~/code/go/src/launcheditor$ 我也尝试使用exec.Run()代替exec.Start(),但似乎也不起作用(尽管它不会在同一地方失败)。如果我使用Gvim而不是Vim,我可以使它工作,但是它拒绝与Vim和nano一起工作。我认为这与在终端仿真器中运行而不是创建外部窗口的Vim和nano有关。
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

很显然,你必须设置StdinStdoutStderr在上Cmd对象os.Std(in|out|err)。像这样(假设对象被称为cmd):

cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

解决此问题的功劳归功于freenode上#go-nuts上的家伙。


查看完整回答
反对 回复 2021-05-17
?
HUH函数

TA贡献1836条经验 获得超4个赞

这对我有用,但是它的缺点是打开另一个终端(版本结束后会自动关闭):

cmd := exec.Command("/usr/bin/xterm", "-e", "vim "+fpath)


查看完整回答
反对 回复 2021-05-17
?
森栏

TA贡献1810条经验 获得超5个赞

在中cmd := exec.Command("vim", fpath),您正在执行或多或少的操作:

$ PATH= vim foo.txt
bash: vim: No such file or directory
$

Shell使用PATH环境变量,exec.Command而不使用。您必须查找vim二进制文件并将其完整路径传递给exec.Commandexec.LookPath为您做到这一点。


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信