伙计们试图使用stat查看perl中某个文件的权限.
所以当我这样做的时候
foreach (@original_files) {
my($dev, $ino, $mode, $nlink, $uid, $gid, $rdev,
$size, $atime, $mtime, $ctime, $blksize, $blocks) = stat ($_);
print "$mode \n";
}
Run Code Online (Sandbox Code Playgroud)
这个输出:
33204 which corresponds to the permission -rw-rw-r--
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它是33204. < - 这是我的第一个问题
接下来我尝试将$ mode转换为octal,我知道这是umask的数字系统.
这是我的代码:
printf ("%0\n",$mode);
Run Code Online (Sandbox Code Playgroud)
现在这输出100664,我完全低于最后3位数(rw-rw-r--)但我不明白前三位数来自哪里(100664中的100) 这是我的第二个问题
最后是我再次尝试此代码:
printf ("%o\n", $mode & 775); #im not sure about the 775, or is it 577
Run Code Online (Sandbox Code Playgroud)
最后一个代码是我想要的.它输出664.我的问题是为什么当我和$模式忘记了价值(775或其他)时,它会输出正确的权限.
而OT问题:$ _和@_的区别是什么?
从我的网站主机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
Run Code Online (Sandbox Code Playgroud)
(注意,前导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
Run Code Online (Sandbox Code Playgroud)
如果您将模式视为其字段而不是数字(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)
Run Code Online (Sandbox Code Playgroud)
执行& 0777
与& (S_IRWXU | S_IRWXG | S_IRWXO)
提取包含各种权限的字段相同.
$_
是一个引用的变量$main::_
.它是由一些结构设置(foreach循环map
,grep
),并作为许多运营商(如默认的say;
意思say $_;
).
将元素@_
别名化为传递给正在执行的子的参数.例如$_[0]
并因此$x
包含4
在sub f { my ($x) = @_; ... } f(4);