windows下sublime text无法直接运行.sh文件,因其不调用bash且不解析shebang;必须安装git for windows并显式配置shell_cmd指向git-bash.exe绝对路径,selector设为source.shell,否则必报bash: command not found。

Windows 下 Sublime Text 无法直接运行 .sh 文件——它不调用 Bash,也不解析 #!/bin/bash,硬配 shell_cmd 为 bash "$file" 必然失败,报 bash: command not found 或静默无反应。必须用 Git Bash 或 WSL 作为后端解释器,并显式指向其可执行文件。
为什么 Windows 下直接配 bash "$file" 一定失败
Sublime 在 Windows 上默认走 cmd 兼容层,bash 不是系统命令;PATH 里没加 Git Bash 路径时,bash --version 都会报错。网上大量教程写 "shell_cmd": "bash \"$file\"",在 Windows 下纯属无效配置。
- 先验证环境:打开 CMD 或 PowerShell,运行
git-bash --version或bash --version,若提示“不是内部或外部命令”,说明 Git for Windows 没装或没进 PATH - 推荐安装 Git for Windows(自带
git-bash.exe),比 WSL 更轻量、路径转换更稳定 - 若坚持用 WSL,得改构建命令为
wsl -e bash -c "cd /mnt/c/xxx && ./script.sh",且脚本必须放在C:\下,否则/home/xxx对 Sublime 不可见
怎么写有效的 Shell.sublime-build 配置
关键不是语法多炫,而是路径、参数、作用域三者对齐。以下是最小可行配置(适配 Git Bash):
{
"shell_cmd": "C:/Program Files/Git/git-bash.exe --cd=\"$file_path\" -c \"bash '$file_name'\"",
"working_dir": "$file_path",
"selector": "source.shell",
"file_regex": "^([^:]+):([0-9]+):?([0-9]+)?:? (.*)$"
}
-
shell_cmd必须是git-bash.exe的绝对路径,用正斜杠或双反斜杠;含空格路径必须包裹,不能只靠$file变量展开 -
--cd和-c是 git-bash.exe 的原生命令行参数,用于切换目录并执行命令,比cd ... &&更可靠 -
selector必须写"source.shell",不是"source.bash"或留空——这是 Sublime 自带语法包定义的作用域名,Bash 插件不会改它 - 保存后,按
Ctrl+Shift+P→ 输入Build: Select Build System,确认你刚建的构建项已出现在列表中
为什么右下角显示 Bash 但 Ctrl+B 还是没反应
显示语言名 ≠ 构建系统能匹配。Sublime 匹配构建系统靠的是语法作用域(scope),不是文件后缀或 shebang。即使你装了 Bash 插件、右下角写了 Bash,如果作用域不是 source.shell,构建仍不会触发。
- 打开任意
.sh文件,按Ctrl+Alt+Shift+P(Win/Linux)或Cmd+Alt+Shift+P(macOS),看状态栏是否显示source.shell - 若显示
source.bash或source.shellscript,说明语法包没对齐;手动点右下角 →Shell-Unix-Generic(Sublime 自带,稳定)或Bash(wbond 插件,高亮强),两者底层作用域都是source.shell - 务必先
Ctrl+S保存文件——未保存的临时缓冲区里$file是空字符串,shell_cmd执行时会崩 - 别信
#!/usr/bin/env bash能自动启用构建:Sublime 完全忽略 shebang
输出一闪而过或看不到错误怎么办
Sublime 构建面板默认不保留终端状态,尤其脚本末尾没 read 或没触发错误时,输出直接消失。这不是配置失败,是行为设计如此。
- 最简方案:在
shell_cmd末尾加&& read -p "Press Enter to exit",让终端停留(仅限 Git Bash / WSL) - 更稳的日志方案:
"shell_cmd": "C:/Program Files/Git/git-bash.exe --cd=\"$file_path\" -c \"bash '$file_name' > /tmp/sublime-run.log 2>&1 && cat /tmp/sublime-run.log\"",再手动查日志 - 避免用
gnome-terminal或cmd /c start类方案:它们新开窗口,和构建面板脱节,无法捕获$?或标准错误流 - 如果脚本含
read name等交互逻辑,Sublime 原生构建不支持 stdin 输入,得换Terminus插件或回终端手动跑
真正卡住人的地方从来不是 build 文件怎么写,而是 Git Bash 路径没查准、selector 写成 source.bash、或者压根忘了点右下角切语法——这三处一错,整个流程就静默失效,连错误提示都没有。











