shfmt是go编写的独立命令行工具,非sublime插件;需先安装shfmt二进制并配置path,再通过sublime的build system(如shfmt.sublime-build)调用,支持-bn、-ci等参数定制格式化行为。

shfmt 插件根本不能直接装进 Sublime Text
Sublime Text 本身不支持直接安装 shfmt —— 它不是插件,而是 Go 写的独立命令行工具。你看到的“shfmt 插件”,其实是第三方包装器(比如 SublimeLinter-shfmt 或 ShellScript 配套的 formatter),它们只是调用系统里已安装的 shfmt 可执行文件。没装 shfmt,插件点不动、格式化报错、甚至根本找不到命令。
常见错误现象:
- 按快捷键(如 Ctrl+Alt+F)没反应
- 控制台报错 shfmt: command not found
- 插件设置里填了路径但依然失败
- 先去官网或 GitHub 下载对应平台的
shfmt二进制(Linux/macOS 用 tar.gz,Windows 用 .exe) - 解压后把
shfmt放到/usr/local/bin(macOS/Linux)或加到 Windows 的PATH环境变量里 - 终端运行
shfmt -version确认能识别,再重启 Sublime Text
Sublime Text 里真正起作用的是 ShellScript 插件 + 自定义 build system
官方推荐的 ShellScript 插件(Package Control 可搜到)本身不带格式化功能,但它提供了语法高亮、折叠和基础 lint 支持,是后续调用 shfmt 的前提。真要“一键美化”,得自己配一个 build system,而不是依赖某个叫“shfmt”的插件包。
使用场景:你写完 deploy.sh,想快速对齐缩进、标准化重定向、统一引号风格,又不想切到终端手动跑 shfmt -w deploy.sh。
- 菜单栏 → Tools → Build System → New Build System…
- 粘贴以下内容并保存为
shfmt.sublime-build:
{
"shell_cmd": "shfmt -w \"$file\"",
"file_regex": "^(.*?):([0-9]+):([0-9]+):(.*)$",
"selector": "source.shell"
}
之后在 Shell 文件里按 Ctrl+B(Windows/Linux)或 Cmd+B(macOS)就能原地覆盖格式化。注意:-w 表示写回原文件,别在没 git commit 的脚本上乱试。
shfmt 参数选错会导致脚本语义变化
shfmt 默认按 POSIX sh 解析,但你的脚本可能是 #!/bin/bash 甚至用了 [[、$(( )) 这类 bash 扩展。参数没对上,轻则格式错乱,重则删掉不该删的空格导致语法错误。
常见错误现象:
- if [[ $x == "y" ]] 被改成 if [ $x = "y" ](语义不同)
- 数组赋值 a=(1 2 3) 被拆成多行后无法执行
- $(cmd) 被强制换行破坏命令替换结构
- bash 脚本必须加
-ln bash(l表示 lint,n表示指定 shell 类型) - 想保留 tab 缩进就加
-i 4 -ci(-i是缩进宽度,-ci表示用 tab 替代空格) - 禁止重排 case 分支可用
-s(safe mode,跳过可能改变行为的重排)
build system 里改 "shell_cmd": "shfmt -ln bash -i 4 -ci -w \"$file\"" 更稳妥。
Windows 上路径和换行符容易让 shfmt 失效
Windows 用户常卡在这儿:明明 shfmt.exe 能在 CMD 里跑,Sublime 却报错 no such file or directory。大概率是 Sublime 启动时没继承你改过的 PATH,或者脚本里混用了 \r\n 和 \n,shfmt 解析失败直接退出。
性能影响不大,但兼容性坑多:
- 不要把
shfmt.exe放在带中文或空格的路径下(比如C:\Program Files\),放到C:\tools\shfmt.exe并在 build system 里写死路径:"shell_cmd": "C:/tools/shfmt.exe -w \"$file\"" - 用 Sublime 的 File → Convert Indentation → Convert Line Endings → Unix (LF) 统一换行符
- 检查脚本首行是否为
#!/bin/bash—— Windows 不认这个,但shfmt会据此判断语法特性,别删
最麻烦的其实是跨平台协作:别人用 macOS 格式化过的脚本,你在 Windows 里打开,Sublime 默认用 CRLF 保存,下次 shfmt 就可能拒绝处理。保持 line ending 一致比选哪个 formatter 更关键。











