在下面的代码中,语句“$retMode & 0777
”和“$retMode & 006
”是什么意思?
use File::stat;
my $fpath = "/home/xyz/abc.sh" ;
my $info ;
my $retMode ;
my $property = "File_Permission";
$info=stat($fpath) ;
if($info){
$retMode = $info->mode; # This field contain file mode info
$retMode = $retMode & 0777;
if(($retMode & 006)) {
printf "$property|%03o|$fpath\n",$retMode;
}
}
答案 0 :(得分:5)
$retMode & 0777
表示您获取返回模式的值(文件权限+文件类型)和Bitwise-And,其八进制表示编号为777(例如十进制511,例如二进制111111111)
这在技术上是从第9位以上的整数中删除任何位,因此如果模式二进制表示是> 9位,则在此操作之后,它将仅留下最后9位,表示主权限(读/写/执行其他/组/用户。)
<强>为什么强>?因为(perldoc stat显示),mode()
从stat
返回:
“包含文件类型及其权限,如果要查看真实权限,则应使用”%o“屏蔽文件类型部分和(s)printf”。< / p>
换句话说,它包含高于第9位的数据,但只有最后9位表示权限数据,这是上述代码之后的数据。更确切地说,最后12位代表权限(因此代码应该代替& 07777
)但是位10-12代表与用户/组/其他读/写/执行权限无关的特殊权限位(例如setuid) ,is_directory)。
$retMode & 006
具有相似的机制,但目的不同。 006八进制是二进制110,因此它基本上取模式位向量,只留下2/3位的位。由于结果用在布尔上下文中,它只会检查结果#是否为非零,这意味着如果将这2位中的一个设置为1。
请注意,& 006
实际上是BAD编码风格,因为不明显哪些位是哪个perms(因为我试图通过不解释2/3位是什么意思来巧妙地提示在上面的段落中)。相反,您应该从Fcntl模块导入符号模式常量(S_IF *)和函数(S_IS *):
use Fcntl ':mode';
$retMode = $retMode & 0777; # Ignoring setuid and directory bits
$other_read_or_write = $retMode & (S_IWOTH || S_IROTH);
# Bits 2/3 - Other read/write
if ($other_read_or_write) {
printf "$property|%03o|$fpath\n",$retMode;
}
答案 1 :(得分:2)
在POSIX环境中,文件的模式是一组位,用于描述文件所有者,文件组以及其他所有人的读,写和执行权限。
有关完整概述,请参阅http://www.tuxfiles.org/linuxhelp/filepermissions.html或google“linux文件权限”。
在这种情况下
if(($retMode & 006)) {
printf "$property|%03o|$fpath\n",$retMode;
}
条件中的代码只有在您对文件具有写入或读取权限时才会运行。
答案 2 :(得分:1)
它们是位操作Perl bitwise and。
$ retMode&amp; 0777清除$ retMode底部9位以上的所有位。
$ retMode&amp; 006测试底部3位中的两位,如果这些位对应于数字2,3,4,5,6,7,则返回true(0以外的数字)
在图片中(其中x为1或0,从顶行到底行不变):
$ RetMode&amp; 0777:
$RetMode: xxxxxxxxxxxxxxxxxx
0777 000000000111111111
Result: 000000000xxxxxxxxx
$ RetMode&amp; 006:
$RetMode: 000000000xxxxxxxxx
0777 000000000000000110
Result: 000000000000000xx0
正如引力图所示,您正在测试该文件的权限。