Sublime Text 运行 Ruby 报错的根本原因是 GUI 环境未加载 shell 配置文件导致 PATH 不一致,需手动在 Settings–User 中配置 path;构建系统需自定义以支持交互式输入和正确编码。

Sublime Text 运行 Ruby 脚本报 command not found: ruby
根本原因不是 Sublime 本身没配 Ruby,而是它默认用的是系统 shell 的 PATH,而 macOS 或某些 Linux 桌面环境(比如 GNOME、KDE)下,GUI 应用启动时往往不加载 ~/.bashrc 或 ~/.zshrc 里的 PATH 修改。
- 先在终端里运行
which ruby,记下输出路径,比如/usr/local/bin/ruby或/opt/homebrew/bin/ruby - 打开 Sublime Text → Preferences → Settings – User,在 JSON 里加一行:
"path": "/usr/local/bin:/opt/homebrew/bin"
(把上面which ruby输出的目录父路径填进去,多个用英文冒号分隔) - Windows 用户注意:
path要写成"path": "C:\Ruby32-x64\bin"这种双反斜杠格式,且确保该路径下真有ruby.exe
用 Build System 运行 Ruby 却卡住不动或没输出
这是 Sublime 默认的 exec 构建器对交互式输入/输出处理得比较糙,尤其遇到 gets、STDIN.read 就会挂住 —— 它没给子进程连上真正的 TTY。
- 不要依赖默认的 Ruby build;手动建一个:Tools → Build System → New Build System
- 粘贴以下内容(macOS/Linux):
{ "shell_cmd": "ruby "$file"", "file_regex": "^(...*?):([0-9]*):?([0-9]*)", "selector": "source.ruby", "variants": [ { "name": "Run in Terminal", "shell_cmd": "osascript -e 'tell app "Terminal" to do script "cd \"$PWD\" && ruby \"$file\""'" } ] } - Windows 用户把
osascript那行换成:"shell_cmd": "start cmd /c "cd /d "$file_path" && ruby "$file_name" & pause""
- 保存为
Ruby.sublime-build,然后在右下角切换 Build System 为 Ruby
Sublime 提示 undefined method `require_relative' 或语法报错
说明当前执行的 Ruby 版本太老(比如系统自带的 1.8.7),而你的代码用了 2.0+ 的特性。Sublime 不会自动识别项目级 Ruby 版本管理器(如 rbenv 或 rvm)的设置。
- 检查终端里
ruby -v和 Sublime 里Build输出的ruby -v是否一致;不一致就说明 PATH 没生效 - 如果用了
rbenv,别只改~/.zshrc;还得在 Sublime 的path设置里显式加上~/.rbenv/shims(注意展开成绝对路径,比如/Users/xxx/.rbenv/shims) - 用
rvm的用户,建议直接用rvm wrapper生成固定路径的 ruby 可执行文件,再指向它,比折腾 shell 初始化更稳
中文路径或文件名下运行 Ruby 报 invalid byte sequence in UTF-8
Sublime 在 Windows 上默认用系统 ANSI 编码读取文件路径,但 Ruby 解释器又按 UTF-8 解析,一碰中文就崩。macOS 相对好些,但某些 locale 设置不对也会触发。
- 最简单:把 Ruby 文件移到全英文路径下,比如
~/code/test.rb,避开问题 - Windows 用户可在 Build System 的
shell_cmd前加编码声明:"shell_cmd": "chcp 65001 >nul && ruby "$file""
(强制 CMD 切 UTF-8) - 长期方案:在 Ruby 文件开头加
# encoding: utf-8,并确保 Sublime 保存文件时也选 UTF-8(右下角点击编码名可切换)
Sublime 对 Ruby 的支持本质是“调外部解释器”,所有问题都绕不开路径、编码、shell 环境这三块。很多人卡在“为什么终端能跑,Sublime 就不行”,答案往往就藏在 which ruby 和 echo $PATH 的差异里。










