在O'Reilly 编写的《Classic Shell Scripting》中,Arnold Robbins 和 Nelson HF Beebe 编写了以下示例:
$ umask 023 $ rm -f foo $ cp /bin/pwd foo $ ls -l /bin/pwd foo -rwxr-xr-x 1 root root 10428 2001-07-23 10:23 /bin/pwd -rwxr-xr-- 1 jones devel 10428 2002-09-21 16:37 foo
生成的权限字符串
rwxr-xr--
反映了权限的丢失:组丢失了写访问权限,其他丢失了写和执行访问权限。
现在,023
开头的输出告诉我,在当前 shell 中,新创建的文件的访问权限将被w
删除g
,并且wx
已被删除o
,因此,虽然我理解“其他文件丢失执行访问权限”,但我没有得到“组丢失写访问权限”或“其他文件丢失写访问权限”,因为它们一开始都没有。
您认为这只是该评论措辞不准确,还是我遗漏了什么?
此外,我在我的系统上尝试过,但结果让我更加困惑:
$ umask
0023
$ cp /bin/pwd ~/foo
$ ls -l /bin/pwd ~/foo
-rwxr-xr-x 1 root root 35072 Jan 18 19:17 /bin/pwd*
-rw-r--r-- 1 myself myself 35072 Feb 1 12:54 /home/myself/foo
现在, 的输出应该意味着0023
删除和(其中实际上只有存在,因此在这种情况下它是唯一被删除的),但相反,看起来和的权限也已被删除。w
g
wx
o
x
o
x
u
g
这是为什么?
在哪里可以找到所有规则来决定当我创建和复制文件时会发生什么情况(就权限而言)?
我尝试过(源文件权限为
-rwxr-xr-x
,umask 设置为023
)cp
在 macOS 上以及在 Ubuntu 上同时使用 GNU coreutilscp
和 Busyboxcp
。它们都创建了一个具有权限的副本-rwxr-xr--
,即复制原始文件的权限,但使用 umask 进行了修改。这似乎就是 POSIX 文本所要求的,它说:
最后一部分读起来有点别扭,但它基本上是说将
open()
使用源文件的文件权限位作为“模式”参数(或通过某些等效方法)来创建新文件。“mode” 参数中给出的位由 umask 修改以获取最终权限。
所以是的,在你的第一种情况下,确实似乎没有丢失组写入位,除非他们考虑从
0777
那里开始并从中删除 umask。书籍有错误。在第二种情况下,嗯,看起来你的
cp
不符合 POSIX。不过,这有点令人惊讶,所以也许还有其他事情发生?例如,如果目标文件foo
在复制之前就存在,则其权限位将保持原样。(它只会用 打开O_TRUNC
。这是文本中的 3. a. ii。)无论如何,包含目录的权限都不会影响它。