这是我不明白的事情。在perl中,假设我有一个文件(句柄)$file
然后
my $mode = (stat $file)[2];
给出文件的模式,描述为类型和权限。然后,在chmod的文档中,建议在将模式从stat发送到chmod时屏蔽文件类型,例如
my $perm = (stat $file)[2] & 07777;
chmod($perm | 0600, $file);
同样,mkdir的文档表明mkdir(FILENAME,MASK)
“创建由FILENAME
指定的目录,其权限由MASK
指定(由umask修改)。”< / p>
Alrighty。这是我没有得到的。在命令行中,我在我的主目录中创建一个dir temp,默认权限为drwxr-xr-x(八进制0755)。然后
$perms = (stat 'temp')[2] & 07777;
返回493。$perms = sprintf("%04o",(stat 'temp')[2] & 07777);
返回0755。我希望chmod(x,'temp')
使用x =(1)和(2)将temp/
上的权限更改为棘手的内容。但是,这三个人都给drwxr-xr-x
(诚然(3)你必须chmod(oct($perms),'temp);
)同样,mkdir(temp,16877)
,mkdir(temp,493)
,mkdir(temp,0755)
都给予权限{{1在drwxr-xr-x
上。
所以,我的问题:真正发生了什么? chmod和mkdir如何获取这三个不同的值并在temp/
上设置相同的权限?我意识到一个答案可能是“有不止一种方法可以做到这一点”,而且就目前而言这很好,但我想了解这里发生了什么。另外,将权限值传递给这些函数的推荐方法是什么?谢谢!
答案 0 :(得分:4)
493十进制= 0755八进制,所以这是一个非问题 - 它们是相同的。 16877十进制= 40755八进制。 看起来chmod只使用它需要的位而忽略高位中的任何内容。
答案 1 :(得分:2)
并非所有文件系统类型都支持所有字段。这是 字段的含义:
0 dev device number of filesystem 1 ino inode number 2 mode file mode (type and permissions)根据文档,
(stat $file)[2]
是文件模式,由类型和权限组成。 16877十进制是40755八进制。额外的40000相当于Fcntl::S_IFDIR
,告诉您$file
是一个目录。