sublime不执行shell脚本,仅调用系统bash/sh;mac上ctrl+b失败主因是语法识别错误、权限未设置或构建路径错误;.sh文件灰色因未正确设为bash语法;permission denied需chmod+x或改构建命令为bash "$file";bash.sublime-build须含source.bash selector且working_dir设为$file_path。

Sublime 本身不执行 shell 脚本,它只调用系统 bash 或 sh 去跑;Mac 上 Ctrl+B 失败,90% 是语法识别错、权限没设、或构建命令路径崩了——不是插件问题,是三个硬性条件没对齐。
为什么 .sh 文件在 Sublime 里全是灰色、关键词不着色
Sublime 完全忽略 #!/bin/bash,只认文件后缀 + 手动设置的语法类型。右下角显示 “Plain Text” 或 “Shell Script” 都无效,必须是 Bash(推荐)或 Shell-Unix-Generic。
- 装 Package Control 后,Command + Shift + P →
Install Package→ 搜Bash(作者 wbond,别选 Bash-IDE) - 重启 Sublime,打开任意
.sh文件,点右下角语言名 → 选Bash - 再点
View → Syntax → Open all with current extension as… → Bash,这样所有.sh就永久绑定
不用插件?用自带的 Shell-Unix-Generic 也行,但 [[ ]]、${arr[@]} 这类语法不会高亮,容易写错还看不出来。
Mac 上 Ctrl+B 报 Permission denied 怎么办
这不是 Sublime 的 bug,是 Unix 权限机制:脚本没 x 位,./script.sh 必然失败。而默认构建系统走的是 ./$file 形式,不加权限就卡住。
- 终端里跑
ls -l script.sh,确认权限含x(如-rwxr-xr-x) - 快速修复:
chmod +x script.sh - 更稳妥方案:改构建命令为
bash "$file",绕过执行权限检查,只依赖读权限 - 别用
sh "$file"测试来“验证脚本没问题”——sh不认[[ ]]和数组,会掩盖语法错误
怎么写一个真正能用的 Bash.sublime-build
关键不是堆参数,而是三点:路径安全、环境可控、作用域匹配。网上很多配置用 sh -c "bash $file" 或漏掉引号,一遇到空格路径就崩。
- 新建构建系统:
Tools → Build System → New Build System - 填入以下内容(注意双引号和
$file的引号包裹):
{
"cmd": ["bash", "$file"],
"selector": "source.shell, source.bash",
"file_regex": "^(...*?):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "$file_path"
}
- 保存为
Bash.sublime-build,不要改名,不要放错目录 -
selector必须包含source.bash,否则即使你手动设了语法,Ctrl+B 也不触发 - 如果脚本依赖当前目录下的其他文件,
working_dir设成$file_path很关键
subl 命令配好了,但运行 HTML/JS 时浏览器打不开或 node 报错
这是常见混淆点:subl 命令行工具和构建系统完全无关。前者只是打开编辑器,后者才是执行逻辑。HTML 和 JS 构建系统要单独配,且不能复用 Bash 的配置。
- HTML:构建系统用
open "$file",selector设为text.html - JavaScript:确保已装 Node.js,构建系统用
node "$file",selector设为source.js - 别把
HTML.sublime-build的selector写成source.shell,否则 Ctrl+B 会试图用 open 去跑 .sh 文件 - 多个构建系统共存时,Sublime 会按
selector匹配,不看你文件名后缀是否带 .sh 或 .js
最容易被忽略的是:构建系统生效的前提,是当前文件的语法类型(右下角显示)和构建系统的 selector 完全对得上——哪怕只差一个字母,Ctrl+B 就静默失败,连报错都不给。











