伙计们试图使用stat来查看perl中某个文件的权限。
所以当我这样做时
foreach (@original_files) {
my($dev, $ino, $mode, $nlink, $uid, $gid, $rdev,
$size, $atime, $mtime, $ctime, $blksize, $blocks) = stat ($_);
print "$mode \n";
}
此输出:
33204 which corresponds to the permission -rw-rw-r--
我无法理解为什么它是33204.< - 这是我的第一个问题
接下来我尝试将$ mode转换为octal,我知道这是umask的数字系统。
这是我的代码:
printf ("%0\n",$mode);
现在这输出100664,我完全低于最后3位数字(rw-rw-r--)但是我不明白前三位来自哪里(100664中的100) 这是我的第二个问题
最后我再次尝试使用此代码:
printf ("%o\n", $mode & 775); #im not sure about the 775, or is it 577
最后一个代码是我想要的。它输出664.我的问题是为什么当我和$模式忘记了价值(775或其他)时,它会输出正确的权限。?
OT问题: $ _和@_ 的区别是什么?
答案 0 :(得分:6)
从我的网站托管商的man 2 stat
关于模式:
S_IFMT 0170000 bit mask for the file type bit fields
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
S_ISUID 0004000 set UID bit
S_ISGID 0002000 set-group-ID bit (see below)
S_ISVTX 0001000 sticky bit (see below)
S_IRWXU 00700 mask for file owner permissions
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
(请注意,前导0
表示这些数字是八进制数。)
您可以在mode
字词中看到七个字段。
S_IFMT file type
S_ISUID set UID bit
S_ISGID set-group-ID bit
S_ISVTX sticky bit
S_IRWXU owner permissions
S_IRWXG group permissions
S_IRWXO other permissions
如果您将模式视为字段而不是数字(0x81B4 = 33204 = 0100664 = 0b1000000110110100),您将获得:
S_IFMT: S_IFREG (regular file)
S_ISUID: 0 (no set UID bit)
S_ISGID: 0 (no set-group-ID bit)
S_ISVTX: 0 (no sticky bit)
S_IRWXU: S_IRUSR | S_IWUSR (user has rw)
S_IRWXG: S_IRGRP | S_IWGRP (group has rw)
S_IRWXO: S_IROTH (other has r)
执行& 0777
与执行& (S_IRWXU | S_IRWXG | S_IRWXO)
相同,后者会提取包含各种权限的字段。
$_
是一个引用$main::_
的变量。它由一些构造(foreach循环,map
,grep
)设置,并被许多运算符用作默认值(例如say;
表示say $_;
)。
@_
的元素别名为传递给正在执行的子的参数。例如$_[0]
因此$x
在4
sub f { my ($x) = @_; ... } f(4);
答案 1 :(得分:2)
-rw-rw-r--
对应二进制数110110100
(第一个 - 不是权限)。当我们处理三位组时,为了方便起见,我们使用八进制(将三位组映射到0-7):644。
要理解100644中的100,man 2 stat
。
关于:
printf(“%o \ n”,$ mode& 775); #im不确定775,还是577
775是十进制,而不是八进制。如果你只想要最后9位,那么AND数字与八进制777(=所有位设置,二进制111_111_111)。
printf "%o\n", 0100664 & 0777; # 664