Linux下.sh脚本直接执行失败但bash命令可运行的原因排查
问题
有人知道为何以./hello.sh方式执行Shell脚本失败,但使用bash hello.sh却能正常运行吗?
脚本内容:
cat /tmp/hello.sh #!/bin/bash echo "Hello World"
执行bash /tmp/hello.sh时能正常输出Hello World,但执行./tmp/hello.sh时报错:
bash: ./tmp/hello.sh: Permission denied
已为脚本设置可执行权限,不确定问题所在。
补充目录权限信息:
ls -ld /tmp drwxrwxrwt. 13 root root 340 Jan 18 11:02 /tmp
ls -ld ./tmp drwxrwxrwt. 13 root root 340 Jan 18 11:02 ./tmp
原因分析与解决办法
核心原因:/tmp目录被挂载了
noexec选项
多数Linux系统会将/tmp目录以noexec参数挂载,该参数会禁止在这个目录下直接执行任何可执行文件(包括Shell脚本):- 用
bash /tmp/hello.sh执行时,是让bash进程读取脚本内容并解释执行,仅需要对脚本有读权限即可,不受目录noexec限制,因此能正常运行。 - 用
./tmp/hello.sh(或/tmp/hello.sh)直接执行时,系统需要将脚本作为可执行程序加载运行,noexec挂载选项会直接阻断这种执行方式,触发权限报错。
- 用
验证方法
查看/tmp的挂载参数:mount | grep /tmp输出中若包含
noexec,即可确认是该原因导致。解决办法
- 移动脚本至无
noexec限制的目录(如用户主目录),设置可执行权限后直接执行:mv /tmp/hello.sh ~/ chmod +x ~/hello.sh ./hello.sh - 若必须在
/tmp执行,继续使用bash /tmp/hello.sh的调用方式。 - 临时移除
noexec挂载选项(需root权限):
注意:系统重启后会恢复默认设置,如需永久修改,需编辑mount -o remount,rw,exec /tmp/etc/fstab文件,移除对应行的noexec参数后重新挂载。
- 移动脚本至无
内容的提问来源于stack exchange,提问作者Metro
相关产品推荐
相关产品推荐

