我在Homebrew中遇到权限问题,这导致我对 RubyPathname.writable?和Pathname.writable_real?.
机一
在这台机器上我没有权限问题。Dir/usr/local可由组成员写入admin:
$ ls -ld /usr/local/
drwxrwxr-x 18 root admin 612 25 Jun 09:24 /usr/local/
我在admin群里:
$ whoami
martin
$ dscl . -read /Groups/admin GroupMembership
GroupMembership: root martin
并且无论我使用 Ruby 还是 Ruby 都会writable?报告writable_real?:
$ irb
>> require "Pathname"
=> true
>> Pathname('/usr/local').writable?
=> true
>> Pathname('/usr/local').writable_real?
=> true
机器二
然而,在这台机器上,我有一个问题,即使/usr/local该组的成员可以写admin:
$ ls -ld /usr/local/
drwxrwxr-x 18 root admin 612 24 Jun 23:12 /usr/local/
我在admin小组中:
$ whoami
mgd
$ dscl . -read /Groups/admin GroupMembership
GroupMembership: root mgd sgd
Ruby 的Pathname.writable?报告/usr/local是不可写的:
$ irb
>> require "Pathname"
=> true
>> Pathname('/usr/local').writable?
=> false
>> Pathname('/usr/local').writable_real?
=> true
为什么?
任何人都可以解释其中的区别吗?
根据文档,这两个功能之间的区别是:
writable?: 调用进程的有效用户id可以写路径吗?writable_real?: 调用进程的真实用户id可以写路径吗?
我仍然不明白为什么Pathname.writable?在(显然)相同的条件下表现不同。