umask本质是权限屏蔽器而非生成器:文件默认上限0666(无x位),目录默认上限0777(必须含x),实际权限=默认权限&(~umask);内核强制过滤文件x位,故新建文件永不自动可执行。

umask本身不“给”权限,只“屏蔽”权限;新建文件默认没有执行位(x),是内核硬性规则,不是umask决定的。
umask的本质是权限屏蔽器,不是权限生成器
umask是一个掩码值,作用是在系统设定的默认上限权限基础上,按位“关掉”某些位。它不做加法,只做减法式的过滤:
- 文件默认上限是 0666(即 rw-rw-rw-),这个值从一开始就不含 x 位
- 目录默认上限是 0777(即 rwxrwxrwx),因为进入目录必须有 x,所以必须保留
- umask 对两者都执行 实际权限 = 默认上限 & (~umask) 运算
为什么文件默认永远不带 x?内核强制限制
Linux 内核在创建普通文件时,会主动清除所有执行位(x),无论 umask 是多少:
- 即使你设
umask 000,新建文件仍是0666,不是0777 - 这是安全设计:防止意外可执行内容(如日志、配置、脚本片段)被直接运行
- 只有显式调用
chmod +x、install -m 755或使用支持设置 x 的工具(如cp -p)才能赋予 x
目录为什么能保留 x?逻辑与安全需求不同
目录的执行位(x)含义是“可进入”,不是“可执行代码”,因此:
- 内核允许目录默认带 x,且必须带 x 才能
cd进入 - 所以目录上限是
0777,umask 只能屏蔽其中部分 x,不能完全禁止(否则目录将不可用) - 例如 umask 002 → 目录权限为
0775(rwxrwxr-x),其他用户仍可进入,但不能写
常见误解澄清:umask 000 ≠ 文件自动可执行
很多人误以为把 umask 设成 000 就能让新脚本直接 ./run.sh,但事实是:
-
touch script.sh或编辑器保存后,权限始终是0666或经 umask 计算后的结果(如0644) - 没有 x,
./方式就失败;但bash script.sh仍可用——它只依赖读权限 - 真正让脚本可执行,靠的是后续
chmod +x或构建流程中明确赋予权限

















