首页 > 解决方案 > os.Wait() 不等待 golang 中的程序终止

问题描述

在我的代码执行过程中的某个时刻,我希望我的程序启动一个编辑器(不管是哪个),以便用户执行一些实时编辑。

我需要我的程序在这一点上停止,直到用户决定关闭编辑器(或多或少 git rebase 的工作原理)

这是我如何去做的

func main() {
    fpath := os.TempDir() + "/afile.txt"
    f, err := os.Create(fpath)
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    cmd := exec.Command("/usr/local/bin/code", fpath)
    err = cmd.Start()
    if err != nil {
        log.Fatal(err)
    }
    err = cmd.Wait()
    if err != nil {
        fmt.Println(err)
    }
}

从来没有打印过错误,但是上面的代码,虽然它当然 open vscode,它在用户关闭编辑器之前终止(返回)。

cmd.Wait()应该处理这个吗?

该程序在 MacOS Catalina fwiw 上执行。

标签: govisual-studio-codeprocess

解决方案


cmd.Wait() 不应该处理这个吗?

是的,确实如此。Go 会按预期等待,这是您的调用/usr/local/bin/code不正确,并且不会等待。的默认行为code是在生成 VSCode 窗口后立即退出。它不会等待窗口关闭,因此 Go 不能等待窗口关闭。

尝试简单地输入code您的终端。你会发现它立即退出,即使你的 VSCode 窗口仍然打开。

code在编辑器窗口关闭之前阻塞(从而允许 Go 等待),您需要将-wor--wait标志传递给它。再次,code -w在您的终端中尝试。在 VSCode 窗口关闭之前,您会找到终端命令块。

实际上,您只需要更改此...

    cmd := exec.Command("/usr/local/bin/code", fpath)

对此:

    cmd := exec.Command("/usr/local/bin/code", "-w", fpath)
    // or
    // cmd := exec.Command("/usr/local/bin/code", "--wait", fpath)

推荐阅读