Go语言调用不存在的命令未返回错误,求助排查
问题分析与修复
你的代码有两个关键问题导致错误提示无法正常显示:
1. 标准输出被重定向到未读取的管道
你执行了os.Stdout = w,把全局标准输出替换成了管道的写端,但完全没有读取管道的读端r。当命令不存在触发错误时,fmt.Println的输出会被写入这个管道,而管道因为没有读端消费数据,会导致写入阻塞,或者程序退出时缓冲区内容未被刷出,最终你看不到错误信息。
2. 错误信息格式化错误
你用fmt.Println搭配带%v的格式字符串,这不会做变量替换,会直接输出Couldn't call fzf: %v加上错误对象,而不是格式化后的错误内容,应该改用fmt.Printf。
修复后的代码(保留管道捕获命令输出场景)
reader := strings.NewReader(listOutput.String()) r, w, _ := os.Pipe() defer w.Close() cmd := exec.Command("idontexist", "--multi") cmd.Stdin = reader cmd.Stdout = w // 仅让命令的输出走管道,不影响全局标准输出 cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Printf("Couldn't call command: %v\n", err) } // 若需要读取命令的输出,可在此处从r读取 // output, _ := io.ReadAll(r) // fmt.Println(string(output))
简化版本(无需捕获命令输出场景)
如果不需要获取命令的输出结果,完全可以去掉管道相关代码,错误提示会直接输出到终端:
reader := strings.NewReader(listOutput.String()) cmd := exec.Command("idontexist", "--multi") cmd.Stdin = reader cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Printf("Couldn't call command: %v\n", err) }
内容的提问来源于stack exchange,提问作者badman
相关产品推荐
相关产品推荐

