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
writable?また、Ruby は、 orを使用するかどうかに関係なく、次のように報告しますwritable_real?。
$ irb
>> require "Pathname"
=> true
>> Pathname('/usr/local').writable?
=> true
>> Pathname('/usr/local').writable_real?
=> true
マシン 2
ただし、このマシンでは、グループ/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
なんで?
誰でも違いを説明できますか?
ドキュメントによると、2 つの関数の違いは次のとおりです。
writable?: パスは、呼び出しプロセスの実効ユーザー ID によって書き込み可能ですか?writable_real?: パスは、呼び出しプロセスの実ユーザー ID によって書き込み可能ですか?
Pathname.writable?(明らかに) 等しい条件下で異なる動作をする理由はまだわかりません。