You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:39:04