You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,即可确认是该原因导致。

  • 解决办法

    1. 移动脚本至无noexec限制的目录(如用户主目录),设置可执行权限后直接执行:
      mv /tmp/hello.sh ~/
      chmod +x ~/hello.sh
      ./hello.sh
      
    2. 若必须在/tmp执行,继续使用bash /tmp/hello.sh的调用方式。
    3. 临时移除noexec挂载选项(需root权限):
      mount -o remount,rw,exec /tmp
      
      注意:系统重启后会恢复默认设置,如需永久修改,需编辑/etc/fstab文件,移除对应行的noexec参数后重新挂载。

内容的提问来源于stack exchange,提问作者Metro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:10:52