应改构建系统为"shell_cmd": "bash -x \"$file\"", selector设为"source.bash",并手动将.sh文件语法设为Bash(非Plain Text或Shell Script),同时锁死Tab缩进;chmod +x非必需,bash调用更符合运维惯例。

Sublime里写完.sh文件,Ctrl+B报Permission denied怎么办
不是脚本写错了,是Sublime默认构建系统试图用./script.sh执行,而当前文件没x权限——但硬加chmod +x反而掩盖问题,也违背运维脚本分发惯例(多数靠bash script.sh调用)。
- 菜单
Tools → Build System → New Build System…,粘贴并保存为Bash.sublime-build - 关键字段必须是:
"shell_cmd": "bash -x \"$file\"",显式调用解释器,-x还能打印每步执行,比静默失败好十倍 -
"selector": "source.shell"要改成"selector": "source.bash"(否则语法作用域不匹配,构建不触发) - 保存后按
Ctrl+Shift+P输入Build: Select Build System,选你刚建的Bash
.sh文件打开后还是Plain Text,语法高亮和折叠全失效
Sublime不看#!/usr/bin/env bash,只认右下角显示的语法作用域。显示Plain Text或Shell Script都无效,必须是source.bash。
- 按
Ctrl+Shift+P(macOS是Cmd+Shift+P),输入Set Syntax: Bash回车 - 如果列表里没有
Bash,说明没装官方语法包:再用命令面板执行Package Control: Install Package→ 搜索Bash(作者wbond,别选Bash-IDE)→ 安装后重启 - 永久绑定:菜单
Preferences → Settings – Syntax Specific,右侧加这两行:{"extensions": ["sh"],"syntax":"Packages/Bash/Bash.sublime-syntax"}
Tab缩进被自动转成空格,结果脚本运行时报syntax error
Shell对then换行、fi位置极其敏感,而Sublime默认把Tab转4空格,表面整齐,实则可能让then和if挤在同一行导致解析失败。
- 先执行
View → Indentation → Convert Indentation to Tabs,把已有空格转回Tab - 菜单
View → Indentation → Indentation Options → Convert Tabs to Spaces→ 取消勾选,锁死为Tab - 再确认
View → Indentation → Detect Indentation已关闭,否则下次打开又自动切空格
脚本写完想直接运行,但不确定该用chmod +x还是bash script.sh
两者用途不同:前者是给文件加执行位,后者是绕过权限检查直接调用解释器。日常调试建议始终用bash script.sh,避免权限污染和误传。
- 部署到生产环境前才加
chmod +x,且必须配合#!/bin/bashshebang - 如果脚本含中文路径或特殊字符,
bash "$file"比./script.sh更可靠,不用处理PATH或当前目录问题 - CI/CD流水线里一律用
bash -e script.sh(-e让任意命令失败立即退出),比依赖x位更可控
source.bash这个语法作用域,而不是文件后缀或shebang;一旦作用域错,高亮、补全、构建全失效,但界面毫无提示。


















