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

umask值为022时,为何新建文件默认无执行权限?

问题背景

我新建了一个名为./foo的文件,内容如下:

#!/usr/bin/env bash

echo 'Hello world'

执行umask命令的输出为:

$ umask -S
u=rwx,g=rx,o=rx

$ umask
022

尝试直接执行该文件(未执行chmod)时,出现权限拒绝提示:

$ ./foo
zsh: permission denied: ./foo

切换到bash shell执行结果一致:

$ bash
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.

bash-3.2$ ./foo
bash: ./foo: Permission denied

用ls -l查看权限,显示文件无执行权限:

$ ls -l foo
-rw-r--r--  1 richiethomas  staff  40 Mar  3 10:11 foo

执行chmod +x foo后,文件可正常执行:

$ chmod +x foo

$ ./foo
Hello world

$ ls -l foo
-rwxr-xr-x  1 richiethomas  staff  40 Mar  3 10:11 foo

疑问:根据资料,umask值022表示“所有者拥有全部权限,其他用户可读、可执行但不可写”,但实际新建文件无执行权限,请问原因是什么?


原因解释
  • 普通文件和目录的默认基础权限不同:
    umask的作用是在「系统默认基础权限」的基础上,移除对应的权限位。但系统对普通文件和目录的默认基础权限设定不一样:

    • 目录的默认基础权限是777(rwxrwxrwx),应用umask 022后,计算得777-022=755(rwxr-xr-x),这和你理解的umask效果一致;
    • 普通文件的默认基础权限是666(rw-rw-rw-),应用umask 022后,计算得666-022=644(rw-r--r--),也就是你看到的权限——没有执行位,这是正常结果。
  • 系统安全设计的考虑:
    普通文件默认不带执行权限是系统的安全策略,目的是防止误创建的文本文件、配置文件等被意外执行,避免恶意代码或错误脚本自动运行带来的风险。如果需要让脚本类文件可执行,必须手动通过chmod +x添加执行权限,这也是最后成功执行文件的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:10:22