sublime build system需用shell模式、绝对路径、chmod+x权限,并在cmd数组中正确分项传参;环境隔离导致path缺失是“command not found”主因,调试应先终端复现命令并检查path。

Sublime 的 Build System 怎么关联 Shell 脚本
能直接调用,但必须确保路径可访问、权限正确、且 Sublime 能捕获输出。Build System 本质是启动一个子进程执行命令,不是“运行脚本”而是“执行命令行”,所以 shell 模式和 cmd 模式行为差异很大,别默认用 cmd。
- 脚本需有执行权限:
chmod +x /path/to/script.sh - 推荐用
shell模式("shell": true),否则/bin/sh -c不会自动加载用户 shell 配置(比如~/.zshrc中的PATH) - 绝对路径最稳;若用相对路径,工作目录是当前打开文件所在目录(
$file_path),不是 Sublime 安装目录 - 避免在脚本里依赖交互式终端特性(如
read、颜色控制序列),Build System 默认无 TTY
Build System JSON 文件里怎么写才能跑通
关键不是“写对语法”,而是让 sublime-build 文件里的字段匹配 Shell 执行上下文。最容易错的是 cmd 字段拼接和变量展开时机。
-
"cmd"是字符串数组,每个元素是独立参数:写成["/path/to/script.sh", "$file"]✅;写成["/path/to/script.sh $file"]❌(会被当单个参数传给sh -c) - 环境变量用
$PATH、$file等 Sublime 内置变量,它们只在cmd数组中展开,不在脚本内部生效 - 若脚本依赖特定环境(如
pyenv或nvm),得在cmd前显式加载:["bash", "-c", "source ~/.bashrc && /path/to/script.sh $file"] - 加
"working_dir": "$file_path"可避免脚本因相对路径失败
为什么脚本执行了却没输出或报 “command not found”
90% 是环境隔离导致的——Sublime 启动时没读你的 shell 配置,PATH 极简(通常只有 /usr/bin:/bin:/usr/sbin:/sbin)。
- 检查实际
PATH:在 Build System 里临时加一行["echo", "$PATH"],看输出是否含你需要的路径(如/opt/homebrew/bin) - 不要依赖
which或command -v在脚本里查命令,它们也受同一PATH限制 - 错误信息
/bin/sh: xxx: command not found就是 PATH 缺失,不是脚本本身问题 - macOS 上 GUI 应用(包括 Sublime)默认不继承 Terminal 的 shell 环境,必须手动补全
调试 Build System 的实用技巧
别靠猜,用最小可验证动作定位问题。
- 先在 Terminal 里手动执行 Build System 里写的完整命令(复制
cmd数组拼成一行),确认能跑通 - 在
cmd开头加["sh", "-x", "/path/to/script.sh"]查看脚本实际执行步骤和变量值 - 把输出重定向到文件:
["/path/to/script.sh", "$file", ">", "/tmp/build.log", "2>&1"],再去看日志 - 如果脚本需要 stdin(比如读取选中文本),Build System 默认不提供;得用插件(如
ShellCommand)或改用exec插件扩展
真正卡住的往往不是语法,而是 Sublime 进程的环境与你预期的 Terminal 环境不一致。每次改完 build 文件,记得从 Command Palette 重新选择一次 Build System,缓存不会自动刷新。











