sublime text 本身不执行 shell 脚本,所谓“运行”实为 build system 将 $file 交由系统 shell 解释执行并捕获输出;关键在于构建规则匹配 source.shell、文件被识别为 shell script、路径权限正确,且需手动设置语法类型、避免空格路径陷阱、处理环境变量隔离问题。

Sublime Text 本身不执行 Shell 脚本,所谓“运行”其实是靠 Build System 把 $file 交给系统 shell 去解释执行,并把 stdout/stderr 捕获到底部面板。关键不是装插件,而是配对构建规则、确保文件被识别为 Shell、且路径和权限不出错。
Build System 必须匹配 source.shell 选择器
Sublime 不会自动把 .sh 文件当 Shell 脚本处理——哪怕你写了 #!/bin/bash,它也只当普通文本。右下角状态栏必须显示 Shell Script,否则 selector 对不上,Ctrl+B 就静默失败或报 No build system。
- 手动设置:打开
.sh文件 → 右下角点击当前语法类型 → 选Shell Script(需已安装官方 ShellScript 包) - 如果文件没后缀或后缀非
.sh(比如deploy),得用View → Syntax → Open all with current extension as… → Shell Script -
selector写成"selector": "source.shell"是硬性要求,别写成shell或bash
cmd 配置要尊重 shebang 且防路径空格
网上常见写法 ["sh", "-c", "$file"] 表面能跑,但绕过 shebang、不传参、路径含空格就崩。真正靠谱的是让系统 shell 自己解析 shebang 并执行,同时安全传入文件路径。
- 推荐配置(macOS/Linux):
["bash", "-i", "-c", "exec \"$1\"", "_", "$file"] -
-i启交互模式,保证Ctrl+C能中断脚本;exec "$1"替换当前进程,避免多一层 shell 嵌套 -
"_"是$0占位符,"$file"作为$1安全传递,比字符串拼接抗空格 - Windows 用户若用 WSL,
cmd改为["wsl", "bash", "-i", "-c", "exec \"$1\"", "_", "$file"],别硬套bash.exe
输出乱码、命令找不到、Permission denied 的真实原因
这些错误几乎从不来自 Sublime 本身,而是环境隔离或权限链断裂:
-
Permission denied:Linux/macOS 下没chmod +x script.sh;Windows 用 PowerShell 则需先运行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - 中文乱码或
command not found:GUI 应用(如 Sublime)启动时不加载~/.bashrc,PATH 缺失。解决办法是改用 login shell:["bash", "-l", "-c", "$file"] - 脚本里调用的命令(如
jq、mytool)在终端能跑,但在 Sublime 里报错?说明 PATH 不一致——要么用绝对路径(/usr/local/bin/jq),要么在cmd里显式 source(不推荐,跨平台易崩)
想看完整输出(含 set -x 调试信息)就得绕过 Sublime 输出面板限制
Sublime 的构建输出面板默认只捕获 stdout/stderr,但不支持交互输入,也不保留颜色。调试时常用 set -x,但它的 trace 输出可能被截断或格式错乱。
- 临时加一句重定向:
set -x 2>&1 | tee /tmp/debug.log,再在终端tail -f /tmp/debug.log - 或者改用 variant 在终端运行:
{"name": "Run in Terminal", "cmd": ["gnome-terminal", "--", "bash", "-c", "bash \"$file\"; read -p 'Press Enter to exit'"]} - 注意 macOS 上得换
osascript调用 Terminal,Windows 用cmd.exe /c start powershell -ExecutionPolicy Bypass -File "$file"
最常被忽略的点是:Sublime 的 Build System 不继承你的 shell 环境变量,也不读 .bash_profile —— 它只认你 JSON 里写的那条命令。哪怕脚本第一行是 #!/usr/bin/env python3,如果 python3 不在系统 PATH 里,照样报错。别指望“应该能行”,每个环节都得实锤验证。











