我在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?
在(显然)相同的条件下表现不同。