sublime text 中需安装 sublimelinter 和 sublimelinter-shellcheck 插件,并配置 shellcheck 可执行路径;仅当语法设为 shellscript 且保存时才触发检查;还可通过自定义 build system(shell.sublime-build)一键运行脚本。

Sublime Text 里怎么让 Shell 脚本保存时自动语法检查?
不能靠 Sublime 自带功能实现,它不内置 shellcheck 集成。必须装第三方插件 + 外部工具配合——核心是让编辑器调用系统已安装的 shellcheck 命令行工具。
实操建议:
- 先在终端运行
which shellcheck,确认已安装(macOS 可用brew install shellcheck;Ubuntu/Debian 用sudo apt install shellcheck) - 安装 Sublime 插件
SublimeLinter和配套 linterSublimeLinter-shellcheck(通过 Package Control 安装) - 如果
shellcheck不在/usr/bin或/usr/local/bin,需在SublimeLinter.sublime-settings中显式配置"executable": "/opt/homebrew/bin/shellcheck"(路径以which shellcheck输出为准) - 默认只对
.sh文件生效;若想支持无后缀脚本,需在文件右下角手动切换语法为ShellScript,或修改插件设置中的extensions
为什么改了脚本却没看到 shellcheck 报错?
常见不是插件没装好,而是触发条件没满足:SublimeLinter 默认只在保存(on_save)和聚焦(on_load)时检查,且仅对「当前语法模式为 ShellScript」的视图生效。
排查步骤:
- 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Set Syntax: ShellScript确认当前语法已正确设置 - 检查状态栏右下角是否显示
ShellScript;若显示Plain Text或Shell-Unix-Generic,linter 不会启动 - 打开 Sublime 控制台(
Ctrl+`),看是否有类似SublimeLinter: shellcheck: xxx.sh ['/usr/local/bin/shellcheck', '--format=gcc', '-']的日志——没有说明根本没调用 - 临时在脚本开头加一行明显错误,如
if [ 1 = 2; then(缺右括号),保存后仍无提示,基本可断定路径或语法识别失败
执行 Shell 脚本前,怎样在 Sublime 里一键运行并查看输出?
Sublime 本身不提供终端执行环境,但可通过 Build System 绑定 bash 命令实现「快捷键运行 + 输出面板显示」,本质是把当前文件路径传给系统 shell。
配置方法:
- 菜单栏选择
Tools → Build System → New Build System… - 替换内容为以下 JSON(注意
file_regex仅用于匹配错误行,非必需):
{
"shell_cmd": "bash \"${file}\"",
"file_regex": "^(...*?):([0-9]*):?([0-9]*)",
"selector": "source.shell"
}
保存为 Shell.sublime-build,然后按 Ctrl+B(Win/Linux)或 Cmd+B(macOS)即可运行。输出直接出现在 Sublime 底部面板。
注意点:
-
${file}是完整路径,含空格时必须用双引号包裹,否则执行失败 - 脚本需有执行权限(
chmod +x script.sh),否则报Permission denied - 该 build system 不支持交互式输入(如
read),遇到会卡住;如需调试,建议切到终端执行
shellcheck 报 “SC2086: Double quote to prevent globbing and word splitting” 怎么处理?
这不是 bug,是 shellcheck 在提醒你:未引用变量可能导致意外拆分或通配符展开。比如 cp $SRC $DST 中,若 $SRC="a b.txt",实际执行的是 cp a b.txt $DST,而非预期的 cp "a b.txt" $DST。
修复原则很直接:
- 所有变量引用都加双引号:
"$SRC"、"$HOME/.config" - 数组展开必须用
"${arr[@]}",不能写"$arr"或${arr[@]} - 命令替换也建议引用:
"$(ls *.log)"比$(ls *.log)更安全 - 例外:用作
[[ ]]内的字符串比较时,不引有时反而更准,如[[ $var == "yes" ]]中$var不引可避免空值导致语法错误,但多数情况仍推荐引起来保持统一
这个警告看似琐碎,却是线上脚本出问题的高频原因——尤其当路径含空格、变量为空或含通配符时,行为会完全偏离预期。











