Windows 10 Git Bash运行Pry gem报Bad file descriptor错误,CMD正常
报错根因
该错误的触发逻辑明确可查:
- Ruby 3.0版本开始,Pry默认使用内置的Reline库完成终端输入读取
- Git Bash的终端基于类Unix伪终端(PTY)实现,和Windows原生控制台的文件描述符权限模型存在差异
- Reline尝试切换到终端raw模式获取光标位置时,调用的系统接口不匹配Git Bash的PTY权限规则,最终抛出Bad file descriptor错误
- CMD作为Windows原生控制台,和Ruby的原生接口完全适配,因此不存在同类故障。
可落地修复步骤
按操作复杂度从低到高排序:
步骤1:修改Pry全局配置
在用户目录(如C:/Users/<你的用户名>/)下创建.pryrc配置文件,写入以下内容:
# 强制绑定Pry的标准输入输出,跳过Reline的自动终端检测 Pry.config.input = STDIN Pry.config.output = STDOUT # 关闭Windows环境下的控制台兼容警告 Pry.config.windows_console_warning = false
保存配置后,重新在Git Bash中启动Pry会话即可验证效果。
步骤2:修正Git Bash启动方式
如果步骤1完成后仍出现报错,检查Pry的启动逻辑:
- 不要将Pry的输出通过管道重定向给其他程序(比如
pry | cat、pry | less),这类操作会将Pry绑定的文件描述符修改为只读模式,导致终端raw模式调用权限不足 - 不要直接调用Ruby安装目录下的
ruby.exe、pry.exe可执行文件启动会话,这类进程会直接绑定Windows原生控制台句柄,和Git Bash的PTY接口不兼容;需要通过Git Bash自带的winpty命令完成终端映射后再启动,示例命令:winpty pry
步骤3:替换Pry的输入读取后端
如果上述步骤均无法解决兼容问题,可以为Pry安装轻量输入读取模块,完全跳过Reline依赖:
gem install pry-coolline
安装完成后,在.pryrc中补充以下配置,强制Pry使用新的输入后端:
Pry.config.input = Pry::Cooline.new Pry.config.output = STDOUT
若需要在Windows环境下获得完整的终端色彩、光标控制能力,可安装ansicon组件完成终端接口的兼容映射,安装后无需额外修改Pry配置即可正常运行。
内容的提问来源于stack exchange,提问作者Agustín A. Bernal
相关产品推荐
相关产品推荐

