Sublime Text 本身不运行 shell 脚本,仅通过构建系统调用系统 Bash 执行;需同时解决语法识别(设为 Bash)、执行权限(chmod +x 或改用 bash "$file")和构建配置(正确路径、selector 为 source.shell)三件事,否则 Ctrl+B 会失败。

Sublime Text 本身不运行 shell 脚本,它只调用系统命令执行;Windows 原生不支持 #!/bin/bash,硬配会失败;Mac/Linux 必须解决权限、路径、语法识别三件事,否则 Ctrl+B 不是没反应,就是报 Permission denied 或 No build system。
为什么 .sh 文件在 Sublime 里全是灰色、关键词不着色
Sublime 默认不把 .sh 当 shell 脚本处理——它只看文件后缀和手动设置的语法类型,完全忽略 #!/usr/bin/env bash。右下角显示 “Plain Text” 或 “Shell Script” 都不对,得是 “Bash” 或 “Shell-Unix-Generic” 才行。
- 先装 Bash 插件(
Package Control: Install Package→ 搜Bash,作者 wbond,不是 Bash-IDE) - 重启 Sublime,打开任意
.sh文件,点右下角语言名 → 选Bash - 再点
View → Syntax → Open all with current extension as… → Bash,这样所有.sh就永久绑定 - 如果不用 Bash 插件,用自带的
Shell-Unix-Generic也行,但[[ ]]、${arr[@]}这类语法不会高亮,容易误判
Mac/Linux 下 Ctrl+B 报 Permission denied 怎么办
这不是 Sublime 的错,是 Unix 权限机制:脚本没 x 位,./script.sh 就必然失败。而 Sublime 构建系统默认走的是 ./$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…,粘贴以下内容:
{
"shell_cmd": "bash -x \"$file\"",
"file_regex": "^([^:]+):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "$file_path",
"selector": "source.shell"
}-
"shell_cmd": "bash -x \"$file\"":双引号保路径安全,-x开启调试模式,每步执行都打印出来,出错时不再只报exit code 1 -
"selector": "source.shell"必须保留——装了 Bash 插件后,实际作用域仍是source.shell,不是source.bash,写错就匹配不上 - 保存为
Bash.sublime-build,路径自动落在Packages/User/;之后Ctrl+Shift+P→Build: Select Build System选它 - 务必先
Ctrl+S保存文件——未保存的缓冲区,$file是空字符串,构建直接失败
Windows 用户别硬配 bash.exe 路径
原生 Windows 没有 /bin/bash,Git Bash 的路径(如 C:\Program Files\Git\bin\bash.exe)含空格、反斜杠、环境变量缺失,shell_cmd 里几乎无法正确转义。强行配置,90% 情况是静默失败或报 command not found。
- 唯一靠谱方案:在 WSL 中启动 Sublime(比如从 WSL 终端运行
code .类似逻辑,用subl .),整个编辑+执行环境统一在 Linux 下 - 如果只是临时调试,VS Code + Remote - WSL 插件更稳,Sublime 在 Windows 主系统里配 shell 构建系统,本质是自找麻烦
- 别信“用 Git Bash 配置就能跑通”的教程——它们大多没测过中文路径、带空格目录、或交互式
read场景
最易被忽略的一点:shell_cmd 里的 $file 是 Sublime 提供的变量,不是 shell 变量;它不会被 ~ 展开,也不会触发你的 .bashrc 别名——想加载环境,得显式 source ~/.bashrc 2>/dev/null,但这会让构建变慢,且可能因交互语句卡住。

















