sublime默认将.sh文件识别为posix shell而非bash,需手动设为bash语法并配置专用build system:用package control安装shellscript包,通过“open all with current extension as...”永久绑定.sh到bash;新建bash.sublime-build文件,使用"bash \"${file}\""确保bash解释器执行,避免sh兼容性问题。

如何让Sublime正确识别.sh文件为Bash语法
默认情况下,Sublime可能把 .sh 文件当成“Shell Script”(POSIX sh),而非 Bash——这意味着 [[ ]]、$(())、数组语法等 Bash 特有结构不会高亮,甚至会报错提示“unexpected token”。
- 打开任意
.sh文件 → 点击右下角当前语法名称(如 “Shell-Unix-Generic”)→ 选择Bash - 若列表里没有
Bash,说明没装对应插件:用 Package Control 安装ShellScript包(它自带 Bash 语法定义,比系统自带的 Shell Script 更准确) - 永久绑定:打开该文件 →
View → Syntax → Open all with current extension as... → Bash,这样以后所有.sh都自动用 Bash 高亮
在Sublime里直接运行Bash脚本的三种方式
Sublime 本身不带终端,所谓“运行”其实是调用系统 shell 执行,关键在配置 build system。别用网上抄来的通用 “Shell” build,它常忽略 shebang 和权限问题。
- 最稳妥方式:新建
Tools → Build System → New Build System,填入以下内容并保存为Bash.sublime-build:
{
"shell_cmd": "bash \"${file}\"",
"file_regex": "^(...*?):([0-9]*):?([0-9]*)",
"selector": "source.shell.bash",
"variants": [
{
"name": "Run in Terminal",
"shell_cmd": "xterm -e bash -c 'bash \"${file}\"; read -p \"Press enter to continue...\"'"
}
]
}
-
shell_cmd直接调用bash而非sh,确保 Bash 语法被解释 - 如果脚本有
#!/usr/bin/env bash且已chmod +x,也可用"shell_cmd": "\"${file}\"",但依赖执行权限,调试时容易卡住 - 别用
sh -c替代bash -c:遇到declare -A或mapfile就直接报错
常见错误:运行后输出一闪而过或报 “/bin/sh: 1: xxx: not found”
这不是 Sublime 的问题,而是 build system 混淆了 shell 解释器和环境上下文。
- 错误现象:
/bin/sh: 1: [[ : not found→ 系统/bin/sh是 dash(Ubuntu/Debian 默认),不支持[[;Sublime 的 build 默认走/bin/sh,哪怕你选了 Bash 语法 - 根本原因:build system 没显式指定解释器,或用了
sh -c启动 - 验证方法:在 build 中加一句
echo $0; echo $SHELL,看实际跑的是哪个 shell - 修复动作:严格使用
bash \"${file}\"形式,不要省略bash;避免在脚本里写#!/bin/sh却用 Bash 特性
为什么不用 Sublime 的 Terminal 插件?
像 Terminus 这类插件确实能开内嵌终端,但它和 build system 是两套逻辑:前者是交互式 shell,后者是单次执行。对 Bash 脚本开发来说,后者更可控。
- Terminal 插件无法捕获
exit 1并跳转到出错行,build system 可以(靠file_regex) - Terminal 里
source ./lib.sh可能因路径或 cwd 不一致失败;build system 的${file}总是绝对路径,更可靠 - 如果你真需要交互调试,建议另开一个终端窗口,cd 到脚本目录手动运行 —— Sublime 的定位是编辑器,不是 IDE
真正麻烦的从来不是配高亮或建 build 文件,而是脚本里混用了 Bash 和 POSIX 语法,又没写清楚 shebang。配完之后,先用 bash -n script.sh 检查语法,再让 Sublime 运行。










