我试图弄清楚如何从Go程序中启动外部编辑器,等待用户关闭编辑器,然后继续执行程序。基于this SO回答,我目前有这段代码:
package main
import (
"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 1
chris@DPC3:~/code/go/src/launcheditor$
我也尝试使用exec.Run()
代替exec.Start()
,但这似乎也不起作用(虽然它不会在同一个地方失败)。
如果我使用Gvim而不是Vim,我可以使用它,但它拒绝使用Vim和nano。我认为这与终端模拟器内运行的Vim和nano有关,而不是创建一个外部窗口。
答案 0 :(得分:11)
显然,您必须将Stdin
对象上的Stdout
,Stderr
和Cmd
设置为os.Std(in|out|err)
。像这样(假设对象被称为cmd
):
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
解决这个问题的好处归于freenode上的#go-nuts上的那些人。
答案 1 :(得分:3)
这对我有用,但它的缺点是打开另一个终端(在编辑后会自动关闭):
cmd := exec.Command("/usr/bin/xterm", "-e", "vim "+fpath)
答案 2 :(得分:1)
在cmd := exec.Command("vim", fpath)
中,你做的或多或少:
$ PATH= vim foo.txt
bash: vim: No such file or directory
$
Shell使用PATH环境变量,exec.Command
没有。您必须查找vim
二进制文件并将其完整路径传递给exec.Command
。 exec.LookPath为你做到了。