sublime text 默认不识别 .sh 文件为 bash 脚本,因后缀未绑定语法包;右下角选“bash”仅临时生效,永久绑定需通过“open all with current extension as… → bash”,且必须使用正确路径 packages/shellscript/bash.sublime-syntax。

Sublime Text 默认不把 .sh 文件识别为 Bash 脚本,直接打开就是“Plain Text”或错配成通用 Shell 语法——这不是插件没装好,是文件后缀根本没绑定到正确的语法包。
为什么点右下角选“Bash”只对当前文件生效?
因为 Sublime 的“Bash”语法项(Packages/ShellScript/Bash.sublime-syntax)只是个可选语法定义,不自动关联任何扩展名。你每次点击它,只是临时覆盖当前视图的语法解析器,关掉再开就重置。
- 临时生效:右下角语言名 → 选
Bash - 永久绑定:
View → Syntax → Open all with current extension as… → Bash(推荐,一步到位) - 手动写配置也行,但路径必须严格匹配:
{"syntax": "Packages/ShellScript/Bash.sublime-syntax"},大小写错一个字母(比如shellscript)就加载失败
选“Bash”还是“Shell-Unix-Generic”?
如果你脚本里用了 [[ ]]、$(( ))、declare -A、数组切片(${arr[@]:0:2})这类 Bash 特有语法,必须选 Bash。选 Shell-Unix-Generic 会把这些全标红或忽略——它专为 POSIX sh/dash 设计,不是给现代 Bash 用的。
-
Bash:高亮mapfile、printf -v、关联数组、扩展 glob(!(pattern)) -
Shell-Unix-Generic:能认if [ ]和case,但[[ $a == b* ]]会被当普通字符串处理 - 别选
Shell Script(旧版 tmLanguage),括号嵌套和变量展开常错位
为什么改了设置还是不生效?常见断点排查
最常卡在三个地方:语法包路径失效、被其他插件劫持、或用了 ST3 兼容旧格式。
- 检查 Sublime 版本:ST4 必须用
.sublime-syntax格式;ST3 若强行用 Bash.sublime-syntax 可能报Unable to load syntax file - 确认没被
ShellScriptImproved或AdvancedShellScript类插件覆盖:进Preferences → Package Control → Disable Package,临时禁用它们再试 - 右下角显示
Bash但关键字仍是灰色?按Ctrl+Shift+P→ 输入Developer: Show Scope Name,光标停在for上,看输出是不是source.shell.bash keyword.control.shell;如果不是,说明语法没真正加载
真正起效的关键就两步:确保右下角显示的是 Bash,且 Developer: Show Scope Name 能打出带 bash 的 scope 链——其余都是干扰项。语法高亮本身不校验逻辑,if [[ $a = $b ]]; then 少个 fi 它照样高亮得明明白白。











