Sublime Text 无法直接运行.sh文件,需配置构建系统:确保语法识别为Bash、文件已保存、有执行权限、构建规则正确绑定;否则Ctrl+B会静默失败或报错。

Sublime Text 本身不支持“双击运行.sh文件”,所谓“直接执行”其实是靠 Build System 调用系统 shell 解释器——没配对构建规则、没设对语法、没保存文件、没执行权限,四个环节任一缺失,Ctrl+B 都会静默失败或报 Permission denied。
为什么 Ctrl+B 没反应或报 “No build system”?
不是脚本写错了,是 Sublime 根本没把当前文件当 Shell 脚本处理。它不会自动识别 #!/usr/bin/env bash,只认后缀 + 手动设置的语法类型。
- 右下角状态栏显示
Plain Text或Shell Script—— 都不对,必须是Bash或Shell-Unix-Generic - 没装 Bash 插件(wbond 版)的话,
[[ ]]、${arr[@]}这类语法不着色,容易误判为错误 - 即使装了插件,也得重启 Sublime,再手动点右下角 →
Bash,然后通过View → Syntax → Open all with current extension as… → Bash绑定.sh后缀 - 未保存的临时缓冲区:
$file变量为空,构建直接跳过,毫无提示
怎么写一个真正能跑的 Bash.sublime-build?
别抄网上带 sh -c 或硬编码 /bin/sh 的旧配置——路径含空格就崩,不读 ~/.bashrc 就缺 PATH,还绕过 shebang。
- 菜单
Tools → Build System → New Build System…,粘贴以下内容并保存为Bash.sublime-build(自动落进Packages/User/):
{
"shell_cmd": "bash -i -c \"source ~/.bashrc 2>/dev/null; exec '$file'\"",
"file_regex": "^([^:]+):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "$file_path",
"selector": "source.shell"
}
-
shell_cmd中exec '$file'确保信号(如 Ctrl+C)能透传到脚本,比bash \"$file\"更可靠 -
source ~/.bashrc补环境变量(macOS 用户可换为~/.zshrc或~/.bash_profile) -
selector必须是source.shell:Bash 插件启用后,实际作用域仍是这个,不是source.bash - Windows 用户请停在这里——原生不支持,WSL 中启动
subl .才是正解
Permission denied 到底该修脚本还是修构建?
报错 bash: ./script.sh: Permission denied 时,90% 是脚本没 x 权限,不是 Sublime 配置问题。
- 终端里跑
ls -l script.sh,确认输出含-rwxr-xr-x(至少有u+x) - 快速修复:
chmod +x script.sh;若只想测试逻辑,不改权限,就把构建命令改成bash \"$file\"(去掉./前缀) - 别用
sh script.sh测试:这绕过权限检查,会误导你认为“脚本本身没问题” - shebang 不影响构建执行——Sublime 不解析它,
shell_cmd里指定什么解释器,就用什么跑
输出一闪而过、看不到错误怎么办?
Sublime 构建面板默认不保留终端状态,脚本一结束就清屏。这不是 bug,是设计如此。
- 在脚本末尾加
read -p "Press enter to continue...",强制暂停 - 重定向输出:
"shell_cmd": "bash -x \"$file\" > /tmp/build.log 2>&1",再手动查日志 - 更推荐加
-x参数(如bash -x \"$file\"):每行执行前打印出来,出错时一眼定位哪行挂了 - 交互式命令(
read、select)在构建系统里基本不可用——它没有 stdin/stdout 交互能力,得切终端跑
最常被忽略的一点:Sublime GUI 启动时(比如从 Dock 点开),$PATH 和终端不一致,/usr/local/bin、brew 装的工具常找不到——所以 shell_cmd 里必须显式 source 配置文件,不能指望环境自动加载。

















