为什么Linux下执行./xx.sh提示Permission denied但bash xx.sh可正常运行
权限问题根因分析
两种执行方式的权限要求存在本质差异,你遇到的报错核心原因是文件本身的执行权限满足要求,但更高层级的限制阻断了直接执行的路径,具体如下:
- 两种执行方式的权限逻辑差异
- 执行
bash xx.sh时,系统仅启动bash进程读取脚本内容解析运行,仅要求当前用户对xx.sh拥有读权限,不需要脚本本身有执行权限,所以能正常运行。 - 执行
./xx.sh时,系统会先尝试将该文件作为独立可执行文件加载,除了要求脚本本身有执行权限外,还有额外的权限校验要求。
- 执行
- 两个常见的核心原因:
- 脚本所在目录缺少执行权限
目录的x(可执行)权限的作用是允许用户访问目录下文件的元数据、执行目录内的可执行文件。如果当前用户对存放xx.sh的目录没有x权限,就算脚本本身权限正常,执行./xx.sh时也会触发权限拒绝报错。 - 脚本所在分区挂载了
noexec参数
如果xx.sh存放在用noexec选项挂载的分区中,系统会禁止该分区下所有文件的直接执行操作,哪怕文件本身配置了执行权限也无法直接运行,但bash xx.sh属于读取文件内容交给解释器执行的操作,不受noexec参数限制,所以可以正常运行。
- 脚本所在目录缺少执行权限
你可以执行
pwd查看当前目录路径,先运行ls -ld .查看当前目录的权限配置,再运行mount | grep 对应分区路径确认分区挂载参数,即可定位具体原因。
内容的提问来源于stack exchange,提问作者YoramEi
相关产品推荐
相关产品推荐

