sublime中.sh文件语法不着色是因未正确设置语法类型,需安装官方bash插件并绑定.sh文件为bash语法;构建系统应使用bash -x "$file"绕过权限问题;语法检查必须用bash -n而非sh -n;缩进须用tab而非空格以避免解析错误。

为什么 .sh 文件关键词全是灰色、不着色
Sublime 不解析 #!/usr/bin/env bash,只认右下角显示的语法类型。显示 “Plain Text” 或 “Shell Script” 都不行,必须是 Bash(来自 Package Control 的官方 Bash 插件)或至少 Shell-Unix-Generic(自带但弱支持现代语法)。否则 [[ ]]、${arr[@]}、$(()) 全部不着色,你写的错语法可能看起来“很干净”,实际一跑就挂。
- 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Package Control: Install Package→ 搜索Bash(作者 wbond,不是 Bash-IDE)→ 安装后重启 Sublime - 重启后打开任意
.sh文件,点右下角语言名 → 选Bash - 再点
View → Syntax → Open all with current extension as… → Bash,这样所有.sh文件永久绑定
Ctrl+B 运行报 Permission denied 或没反应
这不是脚本写错了,是构建系统试图执行 ./$file,而 Unix 权限机制直接拦截。未保存文件时 $file 为空、路径含空格未加引号、selector 不匹配,都会导致静默失败。
- 别依赖
chmod +x—— 运维分发脚本常靠bash script.sh调用,硬加执行位反而掩盖环境差异 - 新建构建系统:
Tools → Build System → New Build System…,粘贴并保存为Bash.sublime-build:
{
"shell_cmd": "bash -x \"$file\"",
"working_dir": "$file_path",
"selector": "source.bash",
"file_regex": "^([^:]+):([0-9]+):?([0-9]+)?:? (.*)$"
}
"shell_cmd": "bash -x \"$file\"" 是关键:显式调用解释器,绕过权限;-x 打印每步执行,比静默失败好十倍"working_dir": "$file_path" 确保脚本里 ./config.json 这类相对路径指向正确目录Ctrl+B,否则 $file 为空,构建直接跳过,毫无提示语法检查靠什么?别信高亮,要靠 bash -n
Sublime 自带的语法高亮和折叠只是视觉辅助,不校验逻辑。真正能发现 if [[ $var == "ok" ]]; then 缺少 fi、变量未引号包裹、数组索引越界等问题的,只有 bash -n(语法检查模式)。
- 把构建命令改成:
"shell_cmd": "bash -n \"$file\" || echo 'Syntax OK'",可快速验证结构合法性 - 更实用的是组合:
"shell_cmd": "bash -n \"$file\" && bash -x \"$file\" 2>&1 | head -50",先过语法关再试跑前 50 行输出 - 注意:
bash -n不展开变量、不执行命令,所以$(ls)不会真执行,但能发现括号不匹配、then缺失等硬错误 - 别用
sh -n测 Bash 脚本——它不认识[[ ]],会误报一堆“unexpected token”
Tab 缩进被转成空格,脚本悄悄出错
Shell 对缩进不敏感,但对 if/then/fi 的换行和分号位置极其敏感。Sublime 默认把 Tab 转成 4 个空格,表面整齐,实际可能掩盖 then 缺失换行、do 后多加了空格等致命问题。
- 执行
View → Indentation → Convert Indentation to Tabs,把已有空格缩进转回 Tab - 禁用自动检测:
View → Indentation → Detect Indentation(取消勾选),避免下次打开又变空格 - 设为固定 Tab:
View → Indentation → Indentation: Tabs,再设Tab Width: 4 - 检查脚本是否真用了 Tab:打开命令面板,输入
Find: Show All Characters,看缩进是→(Tab)还是空格块
if 后,Sublime 自动把后面所有缩进转成空格,而终端里 bash -x 报的错是 syntax error near unexpected token `then'——你得盯着每一行开头是不是真正的 Tab,而不是看着“对齐”就放心。











