Sublime Text Shell脚本开发最佳实践是:语法设为Bash、构建命令显式调用bash、缩进锁死Tabs。.sh文件默认Plain Text需手动设Bash语法;Ctrl+B报Permission denied应改构建系统而非chmod;Tab缩进不可转空格;错误输出建议重定向至日志文件。

Sublime Text 本身不提供开箱即用的 Shell 脚本开发环境,所谓“最佳实践”不是堆插件,而是三件事做对:语法识别必须是 Bash(不是 Shell Script),构建命令必须显式调用 bash(不依赖执行权限或 shebang 解析),缩进必须禁用自动检测并锁死为 Tabs。其余都是干扰项。
为什么 .sh 文件打开还是 Plain Text?必须手动绑定 Bash 语法
Sublime 不解析 #!/usr/bin/env bash,只看文件后缀和当前语法设置。即使你写了标准 shebang,右下角显示 Plain Text 或 Shell-Unix-Generic,高亮、折叠、变量着色全失效。
- 先按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Set Syntax: Bash回车 - 若列表里没有
Bash,说明没装官方Bash语法包:再用命令面板装Package Control: Install Package→ 搜索Bash(作者 wbond,不是 Bash-IDE)→ 安装后重启 - 永久绑定:
Preferences → 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:{"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+Shift+P输入Build: Select Build System,选中你刚建的Bash
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} - 确认
View → Indentation → Indent Using Tabs已勾选;Tab Width显示为 4
输出一闪而过看不到错误?别加 read,改用重定向捕获
在构建面板里加 read 或 sleep 是临时解法,治标不治本。真正要的是完整 stderr/stdout 流,尤其是 bash -n 静态检查或 set -u 报错时的上下文。
- 把构建命令改成:
"shell_cmd": "bash -x \"$file\" 2>&1 | tee /tmp/subl-shell-log.txt" - 错误和执行流会实时写入
/tmp/subl-shell-log.txt,随时tail -f查看 - 如果脚本本身含交互(如
read),不要用 Build System 运行——切到终端执行更可靠,Sublime 只负责写和静态检查
最容易被忽略的是:所有配置都依赖 selector 匹配。装了 Bash 插件后,文件作用域仍是 source.shell,不是 source.bash;所以构建系统的 "selector": "source.shell" 不能乱改,否则 Ctrl+B 根本不会触发。











