sublime text在macos上运行shell脚本的核心是安全稳定地交由系统bash/zsh执行;需同步解决语法识别(设为bash插件)、构建命令引号包裹、执行权限(chmod +x或用bash "$file"绕过)、文件保存及工作目录设置,否则ctrl+b会静默失败或报错。

Sublime Text 在 macOS 上运行 Shell 脚本,核心不是“让 Sublime 执行”,而是让它**安全、稳定地把脚本交给系统 bash/zsh 去跑**。只要语法识别错、构建命令漏引号、权限没设、文件没保存,Ctrl+B 就会静默失败或报 Permission denied、No build system 这类错误——这不是 Sublime 的问题,是配置链断在了某个环节。
怎么让 .sh 文件正确高亮并被识别为 Bash?
Sublime 不解析 #!/usr/bin/env bash,只认右下角显示的语言类型。显示 “Plain Text” 或 “Shell Script” 都不行,必须是 “Bash”(来自 wbond 的 Bash 插件)。
- 用
Cmd+Shift+P调出命令面板,输入Package Control: Install Package,搜Bash(作者 wbond),装它,别装Bash-IDE - 重启 Sublime,打开任意
.sh文件,点右下角语言名 → 选Bash - 再点
View → Syntax → Open all with current extension as… → Bash,这样所有.sh文件默认走 Bash 语法
为什么 Ctrl+B 没反应或报 Permission denied?
90% 是脚本没执行权限,或构建命令写法触发了 Unix 权限检查。macOS 下 ./script.sh 必须有 x 位,否则系统直接拒绝。
- 终端里运行
ls -l script.sh,确认输出含-rwxr-xr-x(至少用户位有x) - 快速修复:
chmod +x script.sh - 更稳妥的构建写法:用
"shell_cmd": "bash \"$file\"",不带./前缀,完全绕过执行权限,只依赖读取权限 - 未保存的文件会导致
$file为空,构建直接跳过——务必先Cmd+S
怎么写一个真正能用的 Bash.sublime-build?
网上很多配置漏引号、混用 cmd/shell_cmd、硬写 sh -c,结果路径含空格就崩溃,或工作目录错乱导致 ./config.json 找不到。
- 菜单
Tools → Build System → New Build System…,粘贴以下内容并保存为Bash.sublime-build(自动落进Packages/User/):
{
"shell_cmd": "bash -x \"$file\"",
"working_dir": "$file_path",
"selector": "source.shell",
"file_regex": "^([^:]+):([0-9]+):?([0-9]+)?:? (.*)$"
}
-
"shell_cmd": "bash -x \"$file\"":双引号保路径安全,-x开启调试模式,每步执行都打印,比只报exit code 1更好定位问题 -
"working_dir": "$file_path":确保脚本内所有相对路径(如./lib.sh)都能正确解析 -
"selector": "source.shell":Bash 插件启用后,实际作用域仍是这个,不是source.bash
macOS 上环境变量缺失怎么办?
GUI 应用(包括 Sublime)启动时默认不加载 ~/.zshrc 或 ~/.bash_profile,所以你在终端能跑的命令(比如 mytool --version),在构建里可能报 command not found。
- 改用登录 shell 启动:
"shell_cmd": "zsh -l -c \"bash -x '$file'\""(macOS 默认 shell 是 zsh) - 或显式 source 配置:
"shell_cmd": "zsh -c \"source ~/.zshrc 2>/dev/null; bash -x '$file'\"" - 如果只是临时调用某个工具,直接写全路径更可靠:
/usr/local/bin/mytool "$file"
最易忽略的一点:macOS 上 zsh 是默认 shell,但很多构建配置仍写 bash;如果你的脚本用了 zsh 特有语法(如 ${arr:#}),却用 bash 去跑,就会静默失败或报错——得同步检查 shebang 和构建命令是否匹配。











