sublime text 中 ctrl+b 运行 ruby 报错“command not found”的根本原因是其默认使用系统 path 查找 ruby,而未配置 rbenv/rvm 或未将 ruby 路径加入 path;应新建 build system 并显式指定 ruby 完整路径,同时设置 env 编码变量和 working_dir 以适配版本管理、utf-8 中文路径及 bundler 环境。

sublime text 里直接按 Ctrl+B 运行 Ruby 报错 ruby: command not found
根本原因不是 Sublime 有问题,而是它默认调用系统 PATH 里的 ruby 命令——如果你没把 Ruby 安装路径加进系统 PATH,或者用的是 rbenv/rvm 管理的 Ruby,Sublime 就找不到可执行文件。
实操建议:
- 在终端运行
which ruby,确认 Ruby 可执行文件真实路径(比如/Users/xxx/.rbenv/shims/ruby或/opt/homebrew/bin/ruby) - 打开 Sublime Text → Tools → Build System → New Build System…,粘贴以下内容(注意替换
ruby路径):
{ "shell_cmd": "/Users/xxx/.rbenv/shims/ruby "${file}"", "file_regex": "^(...*?):([0-9]*):?([0-9]*)", "selector": "source.ruby" }
- 保存为
Ruby.sublime-build,然后在右下角状态栏手动选中这个构建系统 - Mac 上如果用了 zsh,且 Ruby 是通过 rbenv 安装的,
subl命令从终端启动才能继承 shell 环境;否则 Sublime 启动时读不到~/.zshrc里的 rbenv 初始化逻辑
Build System 里写 ruby -v 能跑通,但运行 .rb 文件报语法错误
常见于 Ruby 版本不一致:你终端里 ruby -v 显示 3.2,但 Sublime 调用的可能是系统自带的 2.6(尤其 macos 默认带旧版 Ruby)。
实操建议:
- 在 Build System 的
shell_cmd中显式指定完整路径,别依赖ruby别名或未激活的版本管理器 - 在构建命令里加
-W参数快速验证版本:/path/to/ruby -W -v,看输出是否和终端一致 - 如果用 rvm,不能只写
rvm use 3.2 && ruby ${file}——rvm 是 shell function,Sublime 的 build system 不加载 shell 函数,必须用rvm-exec或直接调用具体路径
中文路径或文件名下运行 Ruby 报 invalid multibyte char (UTF-8)
不是编码设置问题,是 Sublime 默认用系统 locale 启动子进程,而 macOS/linux 某些 locale(如 C 或 POSIX)不声明 UTF-8,Ruby 解析源码时拒绝处理非 ASCII 字符。
实操建议:
- 在 Build System 的
env字段强制注入编码环境变量:
{ "shell_cmd": "/path/to/ruby "${file}"", "env": {"LANG": "en_US.UTF-8", "LC_ALL": "en_US.UTF-8"}, "file_regex": "^(...*?):([0-9]*):?([0-9]*)", "selector": "source.ruby" }
- windows 用户注意:
chcp 65001并不能被 Sublime build system 自动继承,得用cmd /c "chcp 65001 >nul && ruby ${file}"包一层 - 该问题在 Ruby 3.0+ 更敏感,因为默认启用更严格的源码编码检查
想用 Bundler 管理 gem 依赖,但 bundle exec ruby 在 Build System 里不生效
bundle exec 本质是包装器,它要找到当前目录下的 Gemfile 才能生效。Sublime 构建时的工作目录(cwd)默认是文件所在目录,但有时会因项目结构或插件干扰变成其他路径。
实操建议:
- 显式指定工作目录,在 Build System 中加
"working_dir": "${file_path}" - 避免用
bundle exec ruby ${file},改用bundle exec ruby -Ilib "${file}"(加上-Ilib防止 require 报错) - 如果项目有多个 Gemfile(如 monorepo),确保 Sublime 当前打开的是对应子目录下的文件,否则
bundle exec会找不到目标 Gemfile
最易被忽略的一点:Sublime 的 Build System 不支持交互式输入(gets 会立即返回 nil),所有依赖用户输入的 Ruby 脚本,在这里运行都会静默失败——这不是环境问题,是设计限制。