sublime text 本身不执行 shell 脚本,仅通过构建系统调用系统 bash/sh 执行;需同步解决语法识别(设为 bash)、执行权限(chmod +x 或改用 bash "$file")和构建配置(正确 shell_cmd、working_dir、selector)三件事,否则 ctrl+b 必然失败。

Sublime Text 本身不执行 Shell 脚本,它只调用系统 shell(如 bash 或 sh)去运行文件;所以“配置成功”的核心不是让 Sublime 变成解释器,而是让它**安全、可靠、符合预期地把脚本交给系统执行**。关键卡点永远在三处:语法识别不对、构建命令写错、权限或路径失控。
为什么 Ctrl+B 没反应或报 Permission denied
这不是 Sublime 坏了,是 Unix 权限机制在起作用 —— macOS/Linux 下 .sh 文件默认没有执行位,./script.sh 必然失败。而很多 Build System 示例直接写 "shell_cmd": "./$file",这就等于把权限检查甩给系统,一碰就崩。
- 先在终端确认权限:
ls -l script.sh,看到-rwxr-xr-x才对;没x就跑chmod +x script.sh - 更稳妥的做法是绕过权限检查:改用
bash "$file"或sh "$file",只要文件可读就能跑 - 别用
sh "$file"测试来“验证脚本逻辑”——sh不支持[[ ]]、数组、source等 Bash 特性,会掩盖真实错误
怎么写一个真正能用的 Bash.sublime-build
网上很多配置漏引号、混用 cmd 和 shell_cmd、硬写 sh -c "bash $file",结果路径含空格就崩溃,或者工作目录错乱导致 ./config.json 找不到。
- 推荐用
shell_cmd(支持 shell 变量和重定向),不用cmd(需要手动转义空格) - 必须加双引号包裹变量:
"shell_cmd": "bash \"$file\"",否则路径带空格时命令截断 - 显式指定工作目录:
"working_dir": "$file_path",否则脚本里所有相对路径都指向 Sublime 安装目录 -
"selector": "source.shell"或"source.bash",确保只对 .sh 文件生效;如果用的是 Bash 插件,选source.bash更准
完整示例(保存为 Bash.sublime-build):
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
{
"shell_cmd": "bash \"$file\"",
"working_dir": "$file_path",
"selector": "source.bash",
"encoding": "utf-8"
}
为什么 .sh 文件关键词全是灰色、不着色
Sublime 完全忽略 #!/bin/bash,只认右下角显示的语言类型。显示 “Plain Text” 或 “Shell Script” 都不行,必须是 Bash(来自 Package Control 的 Bash 插件)或 Shell-Unix-Generic(自带,但高亮弱)。
- 装插件:Package Control → Install Package → 搜
Bash(作者 wbond),别装 Bash-IDE - 重启后打开任意
.sh文件,点右下角语言名 → 选Bash - 再点 View → Syntax → Open all with current extension as… →
Bash,这样所有.sh就永久绑定 - 不装插件也行,但
${arr[@]}、[[ $a == $b ]]这类语法不会高亮,容易写错还不自知
Windows 上能不能硬配?
不能。原生 Windows 没有 #!/usr/bin/env bash 语义,bash "$file" 会直接报 command not found。WSL 是唯一靠谱方案:在 WSL 里装 Sublime(或用 subl 打开 WSL 路径下的文件),再按 Linux 方式配 Build System。
最容易被忽略的一点:Build System 里的 $file_path 在 WSL 中展开的是 Windows 路径(如 C:\Users\name\script.sh),必须用 wslpath -u 转换,否则 bash 根本找不到文件。真要搞,得写成:"shell_cmd": "bash $(wslpath -u \"$file\")" —— 但这已经超出轻量编辑需求,不如直接进 WSL 终端跑。










