元数据
| id | script-permission-denied | 收录 | 2026-08-29 |
|---|---|---|---|
| 问题域 | 编码代理与终端 | 主题分组 | 权限与安全 |
| 适用工具 | bash · 外部工具 | ||
症状
```
$ ./setup.sh
bash: ./setup.sh: Permission denied
```
- `ls -l` 显示脚本权限是 `-rw-r--r--`(没有 x)。
- 明明文件内容没问题、`bash setup.sh` 能跑,`./setup.sh` 却报 Permission denied。
- 常见场景:从 Windows 拷贝/压缩包解压/新创建的文件,执行位丢失。
原因
1. Linux 用「执行位」决定能否直接运行文件;新文件默认 `644`(无执行位)。
2. `./script.sh` 走「直接执行」路径,需要 x 位;`bash script.sh` 是「把文件当参数读」,不需要 x 位。
3. 从 Windows 复制(FAT/exFAT/网络盘)或 zip 解压常丢执行位;git 仓库里 `core.fileMode` 配置不当也可能让 x 位丢失。
解法
1. **补执行位**:
```
chmod +x setup.sh
./setup.sh
```
2. **不想改权限**:显式用解释器 `bash setup.sh` / `python3 app.py`(对单次运行足够)。
3. **批量**:`chmod +x 站内文档。
4. 预防:git 提交前确认 `git ls-files -s` 里是 `100755`(可执行);解压 zip 用 `unzip` 后按需补 x;`core.fileMode` 保持 true(Windows 挂载盘场景按需处理)。
验证证据
- 本机(WSL Ubuntu,2026-08-29):
- 实测 1:`chmod 644` + `./nox.sh` → `Permission denied`,exit=126——与用户报错一致。
- 实测 2:`bash nox.sh` → 正常输出,exit=0(解释器调用不需要 x 位)。
- 实测 3:`chmod +x` + `./nox.sh` → 正常,exit=0。
- 实测复现日志(2026-08-29)
来源与证据
素材来源:https://stackoverflow.com/questions/18960689/ubuntu-says-bash-program-permission-denied
验证证据:Evidence details kept locally (2026-08-29)