英文:
Command executes but code doesn't return error for non existing commands
问题
在运行fzf命令时,你发现代码没有返回错误,而且成功运行。然后,你将命令更改为一个不存在的命令,但代码仍然没有返回"couldn't call command: command not found",而是直接退出。你不知道可能出了什么问题。
以下是翻译好的代码:
reader := strings.NewReader(listOutput.String())
r, w, _ := os.Pipe()
os.Stdout = w
cmd := exec.Command("fzf", "--multi")
cmd.Stdin = reader
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Println("无法调用fzf:%v", err)
}
w.Close()
然后,你将命令更改为一个不存在的命令,但代码仍然没有返回"couldn't call command: command not found",而是直接退出。
reader := strings.NewReader(listOutput.String())
r, w, _ := os.Pipe()
os.Stdout = w
cmd := exec.Command("idontexist")
cmd.Stdin = reader
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Println("无法调用命令:%v", err)
}
w.Close()
你不知道可能出了什么问题。
英文:
Code in function to run a fzf against an input, while debugging i discovered my code doesn't return errors, this code runs successfully:
reader := strings.NewReader(listOutput.String())
r, w, _ := os.Pipe()
os.Stdout = w
cmd := exec.Command("fzf", "--multi")
cmd.Stdin = reader
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Println("Couldn't call fzf: %v", err)
}
w.Close()
So i changed the command to something that doesn't exist, but the code still doesn't return "couldn't call command: command not found", just exits.
reader := strings.NewReader(listOutput.String())
r, w, _ := os.Pipe()
os.Stdout = w
cmd := exec.Command("idontexist")
cmd.Stdin = reader
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Println("Couldn't call command: %v", err)
}
w.Close()
I don't have an idea what could be wrong.
答案1
得分: 4
cmd.Run()
返回一个错误,并且你的if
代码块得到了正确执行,但是由于你改变了标准输出os.Stdout = w
,所以你在控制台/终端上看不到结果。
fmt
包将内容写入标准输出。
如果你使用log
包,你将会看到错误信息,因为log
包将内容写入标准错误(你没有改变它):
log.Printf("无法调用命令:%v", err)
这将输出类似以下内容(注意默认的日志格式包括时间戳):
2022/12/07 13:46:19 无法调用命令:exec: "idontexist": 可执行文件在$PATH中未找到
或者不要改变标准输出。
另外请注意,log.Println()
和fmt.Println()
不需要格式化字符串。当你指定格式化字符串和参数时,请使用log.Printf()
和fmt.Printf()
。
英文:
cmd.Run()
does return an error, and your if
block gets properly executed, but since you change the standard output os.Stdout = w
you just don't see the result on your console / terminal.
The fmt
package writes to the standard output.
If you use the log
package, you will see the error as the log
package writes to the standard error (which you didn't change):
log.Printf("Couldn't call command: %v", err)
This will output something like (note the default log format includes the timestamp too):
2022/12/07 13:46:19 Couldn't call command: exec: "idontexist": executable file not found in $PATH
Or don't change the standard output.
Also do note that log.Println()
and fmt.Println()
do not require a format string. Do use log.Printf()
and fmt.Printf()
when you specify a format string and arguments.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论