go - 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 上执行。
解决方案
cmd.Wait() 不应该处理这个吗?
是的,确实如此。Go 会按预期等待,这是您的调用/usr/local/bin/code
不正确,并且不会等待。的默认行为code
是在生成 VSCode 窗口后立即退出。它不会等待窗口关闭,因此 Go 不能等待窗口关闭。
尝试简单地输入code
您的终端。你会发现它立即退出,即使你的 VSCode 窗口仍然打开。
要code
在编辑器窗口关闭之前阻塞(从而允许 Go 等待),您需要将-w
or--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)
推荐阅读
- flutter - 如何使用 CupertinoSliverNavigationBar Flutter 制作顶部标签栏
- scala - 解析scala宏中的类型投影
- spring-boot - java 8中如何实现异步重试机制?
- python - 保存表单时如何将数据传递给模型字段?django表单模型保存
- java - 为什么这是错的?
- ios - KeyboardAvoidingView 在 iOS 中无法正常工作
- swift - 设计膳食跟踪应用程序的数据模型
- node.js - 无法访问容器中的 Dockerized Angular 应用程序
- plugins - 在 RTC GUI 中创建按钮
- python - 通过 API 调用在 Golang 中上传 csv 文件(提供 Curl 请求和 python 请求)