所有.sh文件默认无Bash高亮,需通过“Open all with current extension as…→Bash”永久绑定至Packages/ShellScript/Bash.sublime-syntax路径;选错Shell-Unix-Generic等语法会导致现代Bash特性高亮异常。

怎么让所有 .sh 文件一打开就是 Bash 高亮
默认不会,必须手动绑定扩展名到 Packages/ShellScript/Bash.sublime-syntax。右下角点选“Bash”只改当前文件,关掉重开就退回 Plain Text——这不是操作遗漏,是 Sublime 的设计逻辑。
最稳的批量绑定方式是:打开任意一个 .sh 文件 → 点右下角语言名 → Open all with current extension as… → 选 Bash。Sublime 会自动在 Packages/User/Preferences.sublime-settings 里写入:
"extensions":
{
"sh": "Packages/ShellScript/Bash.sublime-syntax"
}
注意:sh 是键名(不带点),值必须是完整路径、大小写完全匹配;写成 shellscript 或 bash 小写都会加载失败。
为什么 .sh 文件绑了 Bash 还是高亮错乱
常见原因是选错了语法项。Sublime 自带两个名字接近的选项:
-
Bash(路径Packages/ShellScript/Bash.sublime-syntax):支持[[ ]]、declare -A、${arr[@]:0:2}、mapfile等现代 Bash 特性 -
Shell-Unix-Generic(路径Packages/ShellScript/Shell-Unix-Generic.sublime-syntax):只认 POSIX sh 语法,[[ $a == b* ]]会被当普通字符串,变量展开和括号嵌套常标红
如果脚本里用了 printf -v 或 !(pattern) 扩展 glob,却选了后者,高亮必然异常——不是插件问题,是语法定义压根没覆盖这些 token。
如何验证绑定是否真正生效
光看右下角显示 Bash 不够。得确认作用域(scope)真被解析为 Bash:
- 把光标停在
for、if或$(( ))上 - 按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS)→ 输入Developer: Show Scope Name - 看输出是不是类似
source.shell.bash keyword.control.shell或source.shell.bash support.function.builtin.shell
如果不是,说明语法包没加载成功。常见断点:Packages/ShellScript/ 目录下缺失 Bash.sublime-syntax 文件(ST4 必须用 .sublime-syntax 格式)、被 ShellScriptImproved 类插件劫持、或 ignored_packages 里误禁了 ShellScript。
想同时给 .bash、.zsh、.env 也加高亮怎么办
不能靠一次“Open all with current extension as…”全搞定,每个扩展名要单独绑定。但可以批量写进用户设置:
"extensions":
{
"sh": "Packages/ShellScript/Bash.sublime-syntax",
"bash": "Packages/ShellScript/Bash.sublime-syntax",
"zsh": "Packages/ShellScript/Bash.sublime-syntax",
"env": "Packages/ShellScript/Bash.sublime-syntax"
}
注意:.env 绑 Bash 是权宜之计——它本质是 shell 变量格式,没 if/for,但能保变量、注释、引号基础着色;若需更准识别(比如区分 export 和普通赋值),得装 DotEnv 插件并单独配其语法路径。
真正容易被忽略的是路径级优先级:如果某个 .sh 文件路径匹配了 file_name_patterns(比如你之前为 Nginx 配过 /etc/nginx/.*),它会无视 extensions 绑定,强行走路径规则——这种冲突得手动删掉对应 pattern 才能回归预期。


















