IMG_9988.txt.txt
Edited: Thursday 1 May 2025

Sunday, June 20, 2021 at 13:30

os.Chmod 时 到 底 用 777 还 是 07772?

cyhone
编 程 沉 思 录

问 题 是 这 样 的 : 我 在 代 码 里 面 调 用 了 os.chmod( “test.txt“ ,777),
希 嫡 把 该 文 件 的 读 百 及 执 行 权 限 对 所 有 用 广 开 放 。
执 行 完 代 码 , 顺 手 ls 看 了 下 。 如 下

$ 1s8 -1 test。,txt-r—-x–X 1 cyhone “_1085706827 _0 Jun 20
13:27 test .tXt

结 果 出 乎 意 料 , 不 仅 文 件 权 限 没 有 按 预 期 的 变 成 :wxrwxrwx。 反 而 执 行
t 其 他 用 户 就 只 有 可 执 行 权 限 同 时 无
读 写 权 限 。

因 为 这 实 在 是 一 个 简 单 又 愚 蠢 的 错 误 , 所 以 先 直 接 给 出 结 论 :

  1. 在 C 语 言 和 Go 语 言 中 , 如 果 想 要 将 文 件 权 限 形 式 修 改 为
    rwxrwxrwx, 需 要 与 成 0777, 而 非 777。

  2. 0777 是 八 进 制 格 式 ,777 是 十 进 制 格 式 。 在 用 Go 语 言 表 示 此 类
    权 限 的 时 候 , 如 果 要 对 标 chmod 命 令 的 表 示 形 式 , 用 八 进 制 表 示
    更 方 便 和 准 确 点 。

  3. 白 而 是 在 命 令 行 直 接 调 chmod 的 话 , 那 0777
    ] 777

这 个 问 题 虽 然 非 常 简 单 , 但 尴尬 的 是 我 还 踩 了 坑 , 所 以 把 这 个 问 题 及 原
因 分 享 出 来 。

原 因

为 什 么 rwxrwxrwx 对 应 的 是 八 进 制 的 0777, 而 不 是 777 呢 ?。

原 因 是 , 底 层 在 将 数 字 翻 译 成 对 应 权 限 时 , 实 际 上 用 的 该 数 字 对 应 的 二
进 制 位 , 并 将 后 9 位 逐 位 翻 i
例 如 , 对 应 八 进 制 0777 来 说 , 其 二 进 制 的 表 示 如 下 :

111 11 1 1 1 1
0777 C LJ L

W X W X 『 W X

从 上 图 来 看 ,0777 就 代 表 了 xrwxrwxrwx。
而 对 于 十 进 制 的 777, 其 二 进 制 的 表 示 形 式 如 下 :

0 0 1 胡 心 0 0 1 0 0 1

F X X

从 其 按 位 翻 译 来 看 , 恰 好 777 的 后 9 位 , 就 代 表 了 z—-x–x, 和 我 们
的 运 行 结 果 一 致 。

那 么 话 说 回 来 , 根 据 这 个 理 论 , 如 果 非 要 用 十 进 制 表 示 rvxrwxrwx, 那
么 应 该 是 511。

我 们 可 以 用 代 码 实 验 下 :

fileMode := os.FileMode(511)fmt.Println(fileMode.String()) // -
工 WXIWXIW 八

从 结 果 看 的 确 是 符 合 预 期 的 。

参 考
。 ls there any difference between mode value 0777 and 7772?

Backlinks