./script.sh报Permission denied,根本原因是文件缺少执行权限x位,与脚本内容无关;需用chmod +x script.sh添加权限,而非依赖shebang或扩展名。

直接运行 ./script.sh 失败,八成是权限或执行方式错了——不是脚本写得不对,而是没过系统那道“执行许可”关。
为什么 ./script.sh 报错 Permission denied?
Linux 默认不给新创建的文件执行权限,哪怕它有 #!/bin/bash 也一样。系统只认权限位上的 x,不看内容。
-
chmod +x script.sh是最常用解法,给当前用户加执行权 - 别用
chmod 777 script.sh:过度开放权限,尤其在多人环境或生产机上很危险 - 如果只想自己能执行,
chmod 755 script.sh更稳妥(所有者可读写执行,组和其他人仅读+执行) - 检查权限是否生效:
ls -l script.sh,看到类似-rwxr-xr-x才算成功
#!/bin/bash 这行到底要不要?
要,但取决于你怎么运行它。
- 用
./script.sh运行时:必须有,否则系统不知道该调哪个解释器,可能 fallback 到sh,导致语法报错(比如[[或$(())在sh下不支持) - 用
bash script.sh运行时:可以没有,因为解释器已显式指定 - 路径别硬写死:
#!/usr/bin/env bash比#!/bin/bash更兼容不同发行版(比如 macOS 的 bash 在/usr/local/bin/bash) - 这行必须是文件第一行,且不能有空格或 BOM;Windows 编辑器保存的 UTF-8 with BOM 会导致
bad interpreter错误
执行时加不加 ./?
必须加,除非你把它放进了 $PATH 里的某个目录(如 ~/bin)并刷新了环境。
-
script.sh(不带./):shell 会在$PATH中找同名命令,当前目录默认不在$PATH里,所以会报command not found -
./script.sh:明确告诉 shell “就在当前目录下找这个文件”,绕过$PATH查找 -
source script.sh或. script.sh:不是执行,而是把脚本内容读进当前 shell 环境,变量、函数定义会保留,但退出状态、cd等操作会影响当前终端
常见错误现象和快速定位
脚本明明有 x 权限还报错?先看错误信息关键词:
-
bash: ./script.sh: No such file or directory:大概率是 shebang 行用了 Windows 换行符(\r\n),用dos2unix script.sh或sed -i 's/\r$//' script.sh修复 -
bad interpreter: No such file or directory:shebang 路径写错,比如写成#!/bin/bashr(多了一个 r),或系统真没装 bash(极少见) -
line xx: syntax error near unexpected token:可能是用了 bash 特性但被sh执行了,检查是否漏了 shebang 或误用了sh script.sh - 中文引号、全角空格、复制粘贴带隐藏字符:用
cat -A script.sh查看不可见字符
真正容易被忽略的是:脚本里每行命令的退出状态($?)默认不中断执行,哪怕某条 cp 失败了,后续命令照常跑——要用 set -e 或显式判断 if [ $? -ne 0 ] 才能及时止损。


















