bash脚本调用Go程序等待用户输入时触发无限循环及EOF报错如何解决
问题原因
- 如果你通过
curl 安装脚本地址 | bash的管道方式执行安装脚本,此时shell进程的标准输入绑定的是curl的管道流,而非用户交互的终端设备(tty),Go程序尝试读取stdin时会直接拿到EOF错误 - 你的Go代码忽略了
ReadString方法返回的错误,EOF发生时拿到的text为空字符串,始终无法退出循环
解决方案
方法1:修改安装脚本(推荐,适配管道执行场景)
将Go程序的标准输入重定向到当前终端设备/dev/tty,修改后的安装脚本如下:
#!/bin/bash set -e set -o noglob curl https://coderkk.net/ReadInput -o ReadInput chmod a+x ReadInput ./ReadInput < /dev/tty
方法2:修改Go代码,增加错误处理
避免忽略输入读取错误,出现异常时直接提示退出,修改后的Go代码如下:
package main import ( "bufio" "fmt" "os" "strings" ) func main() { var text string reader := bufio.NewReader(os.Stdin) for { fmt.Print("Please enter you name here : ") text, err := reader.ReadString('\n') if err != nil { fmt.Printf("\n读取输入失败:%v\n", err) os.Exit(1) } text = strings.TrimSuffix(text, "\n") if text != "" { break } fmt.Println("输入不能为空,请重新输入") } fmt.Printf("Hi %s\n", text) }
方法3:调整安装脚本执行方式
不使用管道执行,先下载脚本再本地运行,即可默认绑定终端输入:
curl https://coderkk.net/install.sh -o install.sh chmod +x install.sh ./install.sh
内容的提问来源于stack exchange,提问作者coderkk
相关产品推荐
相关产品推荐

