sublime text本身不执行shell脚本,仅调用系统bash/sh运行;ctrl+b失败根源在于语法未设为bash、构建命令错误、文件未保存或权限不足。需装wbond版bash插件、重启后手动设.sh为bash语法、配置含"shell_cmd":"bash \"$file\"","working_dir":"$file_path","selector":"source.shell"的bash.sublime-build,并确保文件已保存。

Sublime Text 本身不执行 Shell 脚本,它只调用系统 bash/sh 去跑;Ctrl+B 失败的根源永远在三处:语法没认成 Bash、构建命令写错、文件没保存或权限不对——不是 Sublime 不行,是你没配对。
为什么 Ctrl+B 没反应或报 “No build system”
Sublime 不会自动把 .sh 文件当 Shell 脚本处理,哪怕你写了 #!/usr/bin/env bash。它只看右下角显示的语言类型和 selector 是否匹配。
- 右下角显示 “Plain Text” 或 “Shell Script” 都不行,必须是
Bash(来自 wbond 的 Bash 插件) - 装插件后要重启,再手动点右下角 → 选
Bash,否则高亮错、selector不触发 - 接着点
View → Syntax → Open all with current extension as… → Bash,让所有.sh文件默认绑定过去 - 未保存的文件,
$file变量为空,构建直接静默失败——务必先Ctrl+S
怎么写一个真正能跑的 Bash.sublime-build
网上很多配置漏引号、混用 cmd 和 shell_cmd、硬写 sh -c "bash $file",结果路径带空格就崩,或工作目录错乱导致 ./config.json 找不到。
- 用
shell_cmd(支持 shell 变量和重定向),别用cmd(要自己转义空格) -
"shell_cmd": "bash -x \"$file\"":加双引号防路径含空格,-x开启调试输出,方便查错 -
"working_dir": "$file_path":确保脚本里./xxx.sh这类相对路径能正确解析 -
"selector": "source.shell":Bash 插件实际仍用source.shell作用域,不是source.bash - 保存为
Packages/User/Bash.sublime-build,然后Ctrl+Shift+P→Build: Select Build System选它
“Permission denied” 是 Unix 权限在起作用,不是 Sublime 的 bug
报这个错,说明构建系统正尝试用 ./$file 方式执行——但 macOS/Linux 下 .sh 文件默认无执行位,chmod +x 才能过。
- 终端运行
ls -l script.sh,看到-rwxr-xr-x才对;没x就补chmod +x script.sh - 更稳妥的做法是绕过权限检查:
"shell_cmd": "bash \"$file\""(不带./),只要文件可读就能跑 - 别用
sh "$file"测试逻辑——sh不支持[[ ]]、数组、source等 Bash 特性,会掩盖真实错误 - Windows 用户原生不认
#!/bin/bash,硬配必失败;如需运行,走 WSL 并配对应cmd,别碰 cmd/powershell
Terminal 插件(如 Terminus)反而容易出问题
很多人装 Terminus 想“在 Sublime 里开个终端跑脚本”,结果输出不全、无法输入、卡死、环境变量不对——根本原因是插件模拟终端,但没继承 Sublime 主进程的环境上下文。
-
PATH经常不对:比如你用pyenv或nvm,Terminus 新开的 shell 很可能没加载~/.zshrc - 交互式脚本(要
read、要yes/no)大概率卡住,因为 stdin/stdout 流处理不稳定 - Build System 能拿到完整退出码
$?和标准错误流,适合调试;Terminus 里你只能看输出,看不到这些
最容易被忽略的是:Sublime 的构建系统完全不解析 shebang,也不关心你是否装了 zsh 或 fish;它只认 selector 和文件后缀,且所有路径变量($file、$file_path)都依赖你是否已保存文件。没保存、没设对语法、没配好引号——三者任一出错,Ctrl+B 就是哑巴。











