从stat函数输出中理解和解码文件模式值

时间:2013-02-24 19:26:59

标签: linux perl unix permissions stat

我一直试图了解下面提到的代码究竟发生了什么。但我无法理解它。

$mode = (stat($filename))[2];
printf "Permissions are %04o\n", $mode & 07777;

假设我的$ mode值为33188

$ mode& 07777产生值= 420

  • 是$模式值的十进制数?

  • 为什么我们选择07777以及我们为什么要进行按位和操作。我无法理解这里的逻辑。

1 个答案:

答案 0 :(得分:7)

perldoc -f stat中对此进行了解释,我假设您在此处找到了这个示例:

Because the mode contains both the file type and its
permissions, you should mask off the file type portion and
(s)printf using a "%o" if you want to see the real permissions.

printf "%04o", 420的输出为0644,这是您文件的权限。 420只是八进制数0644的十进制表示。

如果您尝试以二进制形式打印数字,则更容易看到:

perl -lwe 'printf "%016b\n", 33188'
1000000110100100
perl -lwe 'printf "%016b\n", 33188 & 07777'
0000000110100100

正如您将注意到的,按位and删除上面数字中最左边的位,这可能代表文件类型,只留下文件权限。这个数字07777是二进制数:

perl -lwe 'printf "%016b\n", 07777'
0000111111111111

在按位and中充当“掩码”。从1& 1 = 1,0& 1 = 0,表示07777中与1不匹配的任何位都设置为0。