パーミッション

勉強も兼ねてhttp://www.kuzuore.com/misc/dust/permissions/permissions_list.txtを出すようなのを作ってみる。

4096.times{|i|
  owr = (i % 01000 / 0100) & 0b100	# owner r
  oww = (i % 01000 / 0100) & 0b010	# owner w
  owx = (i % 01000 / 0100) & 0b001	# owner x

  grr = (i % 0100 / 010) & 0b100	# group r
  grw = (i % 0100 / 010) & 0b010	# group w
  grx = (i % 0100 / 010) & 0b001	# group x

  otr = (i % 010) & 0b100	# other r
  otw = (i % 010) & 0b010	# other w
  otx = (i % 010) & 0b001	# other x

  # non-stickey
#   print \
#   "#{owr<1?'-':'r'}" +
#   "#{oww<1?'-':'w'}" +
#   "#{owx<1?'-':'x'}" +
  
#   "#{grr<1?'-':'r'}" +
#   "#{grw<1?'-':'w'}" +
#   "#{grx<1?'-':'x'}" +
  
#   "#{otr<1?'-':'r'}" +
#   "#{otw<1?'-':'w'}" +
#   "#{otx<1?'-':'x'}" +

#   "\n"  

  # stickeys
  ots = (i / 01000) & 0b001
  grs = (i / 01000) & 0b010
  ows = (i / 01000) & 0b100

  printf("%04o is -", i)
  print \
  "#{owr<1?'-':'r'}" +
  "#{oww<1?'-':'w'}" +
  "#{owx<1?(ows<1?'-':'S'):(ows<1?'x':'s')}" +

  "#{grr<1?'-':'r'}" +
  "#{grw<1?'-':'w'}" +
  "#{grx<1?(grs<1?'-':'S'):(grs<1?'x':'s')}" +

  "#{otr<1?'-':'r'}" +
  "#{otw<1?'-':'w'}" +
  "#{otx<1?(ots<1?'-':'T'):(ots<1?'x':'t')}" +
    
  "\n"
}

ずるして

r = ['-', 'r']
w = ['-', 'w']
x = ['-', 'x']

r.each{|i|
  w.each{|j|
    x.each{|k|
      r.each{|l|
        w.each{|m|
          x.each{|n|
            r.each{|o|
              w.each{|q|
                x.each{|u|
                  printf"%s"*9+"\n", i,j,k,l,m,n,o,q,u
                }
              }
            }
          }
        }
      }
    }
  }
}

みたいなやりかたの方が簡単かなと思ったけど、そうでもないらしい。確かめてないけど。

それはともかく、パーミッションは意味がややこしい。S とか T って意味ないように思える。
ディレクトリに対しては意味が違ってくる場合があるところとかも。