疑问?

linux系统中,我们经常使用chmod进行文件权限修改(读,写,执行)

比如我要对some.sh赋予权限: chmod u=rwx,g=rx,o=x some.sh

  • u=rwx
    • u 表示文件所有者(user)。
    • rwx 表示读(r)、写(w)和执行(x)权限。
    • 这意味着文件所有者将拥有读、写和执行权限。
  • g=rx
    • g 表示文件所属组(group)。
    • rx 表示读(r)和执行(x)权限。
    • 这意味着文件所属组将拥有读和执行权限,但没有写权限。
  • o=x
    • o 表示其他用户(others)。
    • x 表示执行权限。
    • 这意味着其他用户将只有执行权限,没有读和写权限。

可以看到我们分别对文件所属人,文件所属组,其他用户赋予了读,写,执行的权限,那这些信息实际存储是什么样子的呢?难道是一个数组?

u: [r, w, x], g: [r, x], o: [x]

这种看起来最直观,但有没有更优雅的方式,比如用一个数字就能表示所有的权限信息,u: 7, g: 5, o: 1,经常用这个命令的人知道,上述的写法可以使用chmod 751 some.sh直接表示


那为什么我通过数字7就能知道是对应的rwx呢?其实从二进制层面来看,就直观许多

  • execution: 执行,通过1表示,二进制表示:001
  • write: 编写,通过2表示,二进制表示:010
  • read: 读取,通过4表示,二进制表示:100

7 实际上是 通过 1 + 2 + 4 得来的,而7的二进制:111

从这里就能看出,当相应的权限拥有时,对应的数字进行相加,从二进制的层面来看,每个权限只会赋值一次,所以进行相加时,二进制中的每一位信息都能进行保留。然后我们再通过查看权限对应位是否为1,就能知道是否有该权限

但二进制是让机器看的,我们怎么知道是不是有值,那这里通过&运算就能快速知道结果了


位运算 & (与)

规则:二进制对应位两两进行逻辑AND运算(只有对应位的值都是 1 时结果才为 1, 否则即为 0)即 0&0=0,0&1=0,1&1=1


比如 111(7) & 010(2)= 010(2)就能确认出是拥有权限的

如果我们只赋予了写,执行权限,我们想看有没有读权限。011(3)& 100(4) = 000计算结果就是没有权限。

可以看到通过位运算,就能优雅的实现权限设置和读取。当然这里每个权限的取值也是有规则的,必须是2的进制位

比如:1(0001), 2(0010), 4(0100), 8(1000)以此类推。

总结:

当我们自己在开发中遇到类似的需求,比如:权限设置之类的,有多种情况,并且每种情况只设置一次。那就能使用该技巧,来进行优化。