Sublime本身不运行Shell脚本,仅调用系统bash执行;需三步核心配置:语法设为Bash(装wbond版插件并绑定.sh)、构建命令设为"bash -x \"$file\""、缩进锁死为Tabs(禁用detect_indentation),否则高亮错乱、Permission denied或静默失败。

Sublime 本身不运行 Shell 脚本,它只调用系统 bash 执行文件;所谓“高效编写与调试”,核心就三件事:语法必须设为 Bash、构建命令必须写成 bash -x "$file"、缩进必须锁死为 Tabs。其余配置都是噪音。
为什么 .sh 文件打开还是 Plain Text?必须手动设成 Bash 语法
Sublime 不解析 #!/usr/bin/env bash,只看文件后缀和当前语法设置。右下角显示 “Plain Text” 或 “Shell Script” 都不行,必须是 “Bash” 才能正确高亮 [[ ]]、${arr[@]}、进程替换等现代 Bash 特性。
- 按
Ctrl+Shift+P(macOS 是Cmd+Shift+P),输入Package Control: Install Package,搜索并安装Bash(作者 wbond,不是 Bash-IDE) - 重启 Sublime,打开任意
.sh文件,点击右下角语言名 → 选Bash - 再点
View → Syntax → Open all with current extension as… → Bash,这样所有.sh文件就永久绑定 - 如果想用 Settings – Syntax Specific 永久生效,右侧加:
{"extensions": ["sh"], "syntax": "Packages/Bash/Bash.sublime-syntax"}
Ctrl+B 报 Permission denied?别 chmod +x,改构建命令
报错不是脚本写错了,是 Sublime 默认尝试执行 ./script.sh,而 Unix 权限机制直接拦截。硬加 x 位反而掩盖问题,且不符合运维分发习惯(多数脚本靠 bash script.sh 调用)。
- 菜单
Tools → Build System → New Build System… - 粘贴保存为
Bash.sublime-build(自动落在Packages/User/):{"shell_cmd":"bash -x \"$file\"", "file_regex":"^([^:]+):([0-9]+):?([0-9]+)?:? (.*)$", "working_dir":"$file_path", "selector":"source.shell"} -
"shell_cmd":"bash -x \"$file\""是关键:显式调用解释器,绕过权限检查;-x开启调试模式,每步都打印,比静默失败好十倍 - 保存文件后再按
Ctrl+B—— 未保存的缓冲区里$file是空字符串,构建必失败
Tab 缩进被转成空格?Shell 脚本里制表符不是可选项
Shell 对缩进本身不敏感,但对 if/then 的换行和分号位置极其敏感。Sublime 默认把 Tab 转成 4 个空格,表面整齐,实际可能掩盖 then 缺失换行或分号导致的语法错误。
- 先执行
View → Indentation → Convert Indentation to Tabs,把已有空格转回 Tab - 再进
Preferences → Settings – Syntax Specific,右侧加:{"detect_indentation": false, "tab_size": 4} - 状态栏应显示
Tabs: 4,不是Spaces: 4 - 别信“自动检测”:Sublime 对 Shell 的缩进检测经常误判,尤其混用空格和 Tab 时,
if报错但光标停在奇怪位置,八成是缩进类型不一致
输出一闪而过或看不到错误?重定向或加 read 是刚需
Sublime 构建面板默认不保留终端状态,尤其脚本末尾没 read 或没触发错误时,输出直接消失。这不是构建失败,是面板关太快。
- 在构建命令末尾加
&& read -p "Press Enter to exit"(Linux/macOS),让终端停留 - 更稳妥的做法是重定向:
bash -x "$file" > /tmp/sublime-run.log 2>&1,再手动查日志 - 避免用
gnome-terminal -- bash -c ""类方案:它新开窗口,和构建面板脱节,无法捕获$?或标准错误流 - 如果脚本要交互(比如
read name),默认 build 不支持 stdin 输入,得换Terminus插件或改用终端手动跑
真正卡住人的从来不是语法,而是 $file_path 没设对导致相对路径失效、detect_indentation 没关掉导致缩进类型混乱、或者忘了 Ctrl+S 就按 Ctrl+B —— 这些细节不处理,再全的插件也救不了。


















