Shell语法高亮不生效需检查文件关联类型,Sublime Text默认不识别.sh等后缀,应手动设置为Shell Script并配置语法特定设置;运行报“Permission denied”须先chmod +x再用Build系统;Tab缩进需禁用自动检测并设为Tabs:4;调试建议用set -x配合2>&1捕获完整输出。

Shell语法高亮不生效?检查文件关联类型
Sublime Text 默认不会自动把 .sh 文件识别为 Shell 脚本,尤其当你用非标准后缀(比如 deploy、build)或没后缀时,高亮就没了。
- 打开文件后,右下角看状态栏,确认显示的是
Shell Script,不是Plain Text或Unknown Syntax - 如果不对,点击状态栏 → 选择
Shell Script→ 再点Open all with current extension as… - 想永久生效?编辑
Preferences → Settings – Syntax Specific,加这行:"extensions": ["sh", "bash", "zsh"]
别依赖文件名猜:Sublime 不看 shebang(比如 #!/bin/bash),只认后缀或手动设置。
运行 Shell 脚本总报“Permission denied”?别直接 Build
Sublime Text 的 Build System 默认调用解释器执行代码,但如果你写的是可执行脚本(带 #!/usr/bin/env bash),又没给权限,Ctrl+B 就会卡在 Permission denied。
- 错误做法:写完脚本就
Ctrl+B,指望它像 Python 那样自动解释 - 正确做法分两步:
- 先在终端跑
chmod +x script.sh - 再用
Ctrl+Shift+B调出 Build 系统菜单,选Shell Script – Run(需安装 Package Control 后装ShellScript插件)
- 先在终端跑
- 或者更稳:用
Tools → Build With… → New Build System…自建一个:{ "shell_cmd": "bash \"${file}\"", "file_regex": "^(...<em>?):([0-9]</em>):?([0-9]*)", "selector": "source.shell" }
注意:shell_cmd 里用 bash 显式调用,比直接执行文件更可控,也绕过权限问题。
Tab 缩进混乱?Shell 要求制表符,不是空格
Shell 脚本对缩进极其敏感:if 块里的 then 必须跟在换行后或和 if 同行用分号隔开;而缩进本身只是可读性辅助——但 Sublime 默认把 Tab 转成 4 个空格,容易掩盖语法错误。
- 进入
View → Indentation → Convert Indentation to Tabs - 再设
Indentation → Tab Width: 4(Shell 社区惯例,非强制但建议统一) - 关键一步:打开
Preferences → Settings – Syntax Specific,加这两行:"detect_indentation": false, "tab_size": 4
- 检查当前缩进模式:状态栏应显示
Tabs: 4,不是Spaces: 4
别信“自动检测”:Sublime 对 Shell 的缩进检测经常误判,尤其混用空格和 Tab 时,if 报错但光标停在奇怪位置,八成是缩进类型不一致。
调试时看不到变量值?别靠 echo 盲打
Shell 没有交互式 debugger,但 Sublime 可以配合 set -x 和终端复现快速定位。
- 在脚本开头加
set -x,它会让每条命令执行前先打印出来(含变量展开结果) - 但 Sublime 的 Build 输出默认截断长行、不显示颜色,关键信息可能被吞掉
- 实操建议:
- 把脚本第一行改成
#!/usr/bin/env bash -x - Build 时用
shell_cmd改为:"shell_cmd": "bash -x \"${file}\" 2>&1" - 加
2>&1是为了把 stderr(即set -x的跟踪输出)也捕获进 Build 面板
- 把脚本第一行改成
注意:别在生产脚本里留 set -x,它会暴露敏感路径和变量内容;调试完记得删或注释掉。
Shell 脚本开发里最麻烦的不是语法,是环境隐含假设——你本地 /bin/bash 有,别人机器可能是 /usr/bin/bash;你测试时用了 [[,CI 却跑在 dash 下直接报错。这些没法靠 Sublime 配置解决,得从 shebang、兼容写法和最小化依赖开始。

















