将权限传递给perl的chmod和mkdir函数

时间:2012-02-08 03:43:22

标签: perl

这是我不明白的事情。在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)。然后

  1. perl的stat告诉我这个目录的模式是16877.
  2. $perms = (stat 'temp')[2] & 07777;返回493。
  3. $perms = sprintf("%04o",(stat 'temp')[2] & 07777);返回0755。
  4. 我希望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/上设置相同的权限?我意识到一个答案可能是“有不止一种方法可以做到这一点”,而且就目前而言这很好,但我想了解这里发生了什么。另外,将权限值传递给这些函数的推荐方法是什么?谢谢!

2 个答案:

答案 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是一个目录。