shell脚本在sublime中需通过build system运行,而非插件或双击;须确保.sh后缀、正确shebang、执行权限、utf-8无bom编码,并配置尊重shebang的json构建系统。

Shell脚本在Sublime里直接运行不了?先确认你用的是Build System
Sublime本身不带终端执行环境,所谓“运行Shell脚本”,其实是靠Build System把当前文件传给系统shell去执行。不是插件、不是终端面板、更不是双击打开——这点很多人混淆,结果装了一堆Terminal插件却还是跑不起来。
常见错误现象:Unable to find target、No build system、脚本明明有#!/bin/bash但输出全是乱码或直接卡住。
- 确保文件保存为
.sh后缀,且第一行是有效的shebang(如#!/bin/bash或#!/usr/bin/env bash) - 不要依赖Sublime自带的
ShellScript语法高亮包来“运行”脚本——它只管高亮,不管执行 - Mac/Linux用户注意:如果脚本用了
#!/bin/zsh但系统默认shell不是zsh,可能报bad interpreter
怎么写一个靠谱的Shell Build System(macOS/Linux通用)
Sublime的Build System本质是JSON配置,核心是告诉它:用哪个命令、传什么参数、在哪执行。别抄网上过时的sh -c "bash $file"写法——它绕过shebang,还容易崩在含空格路径上。
推荐直接复用系统shell并尊重当前文件权限和shebang:
{
"cmd": ["bash", "-i", "-c", "exec \"$1\"", "_", "$file"],
"selector": "source.shell",
"shell": true,
"working_dir": "$file_path"
}
-
bash -i -c "exec \"$1\"" "_":启动交互式bash,再用exec替换当前进程,确保信号(如Ctrl+C)能正确传递到脚本 -
"$file"作为参数传进去,比拼接字符串安全,避免路径含空格或特殊字符时报错 -
"working_dir": "$file_path"让脚本在自身目录下运行,不然./xxx.sh这种相对路径会失败 - Windows用户请勿硬套——WSL另配,原生cmd/powershell不认
#!/,得另写适配逻辑
为什么Terminal插件(如Terminus)反而容易出问题?
很多人装Terminus或SublimeREPL想“在Sublime里开个终端跑脚本”,结果发现:输出不全、无法输入、脚本卡死、环境变量不对。根本原因是这类插件模拟终端行为,但没真正继承Sublime主进程的环境上下文。
- PATH经常不对——比如你用
pyenv或nvm管理工具链,Terminus新开的shell未必加载你的~/.zshrc - 交互式脚本(要read、要yes/no)大概率卡住,因为插件的stdin/stdout流处理不稳定
- Build System方式能拿到完整退出码、标准错误流,方便调试;而Terminus里你只能看输出,看不到
$? - 真需要终端交互?不如直接用iTerm2/Alacritty切过去,用
subl --command "build"配合快捷键更稳
权限、编码、shebang:三个被忽略却必爆的点
哪怕Build System写对了,这三处错一个,脚本就静默失败或报怪错。
- 脚本必须有执行权限:
chmod +x script.sh,否则Permission denied——Sublime不会帮你加 - 文件编码要是
UTF-8 without BOM,Windows记事本存的UTF-8 with BOM会导致#!/bin/bash被识别成乱码,报bad interpreter - shebang路径要真实存在:
#!/usr/local/bin/bash在没装Homebrew bash的机器上就是死路,优先用#!/usr/bin/env bash - 如果脚本里调用了
sudo,Build System不会弹密码框——它没TTY,得提前配好NOPASSWD或改用终端手动跑
复杂点在于:这些条件彼此耦合。比如你改了shebang,忘了改权限;或者在VS Code里调通了,换到Sublime发现编码不对。调试时别只盯Build System配置本身。










