ワイ、そして IT ときどき何か。

日々のとりとめのない記録

sudo gem install sass でエラー "ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/sass" と出る場合

$ sudo gem install sass
エラー

ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/sass

not permitted とは、「あなたには許可されていませんよ」という意味で、/usr/bin/ へのアクセスは root 及び admin に対しても許可はされていない。 この場合は、以下のようにすると通る(Mac OS X El Capitan)

$ sudo gem install -n /usr/local/bin sass

※ -n は正規表現で、上述の場合、/usr/local/bin と、最後のスラッシュ(/) を抜いてもインストールさせる、ということを表す(strict的な意味にしか過ぎないが)。なお、/usr/local/bins というものがある場合、状況によりそちらにインストールされるがそんな奇特な人はいないとは思う。 また、/usr/bin/ へのアクセスが許可されていないと思われるから、/usr/local/bin/ へインストールさせる、というコマンド(命令)でもある。

なぜエラーになるのか、なぜなら、El Capitan のセキュリティ上、 /usr/bin/ へのアクセスが制限されているからで、 /usr/local/bin/ に対してはアクセス制限は /usr/bin/ へのアクセスほど厳しくなく、「ある程度の許可」がされているから。

例えば、Mac OS El Capitan 上に /usr/bin/top というものがあるが、/usr/local/bin/top というものがウイルス・マルウェア感染させたものを存在させることが出来ても、
/usr/bin/top の方を優先させることにより、セキュリティを強化させるための仕様だからだったりする。 すなわち、/usr/local/bin/top を別のものに置き換えたとしても、

$ top

と実行したものは汚染された /usr/local/bin/top ではなく、/usr/bin/top のものを優先する。

すなわち、上述のインストールされたものは sass なので

$ sass

と入力されても、最初は /usr/bin/sass を参考にするが Mac OS のデフォルトでは存在しないので、次に存在するであろう /usr/local/bin/sass を参考にすることになる。
これが汚染されていなければ問題なく sass は余計な挙動をすることなく scss 及び sass ファイルを CSS にコンパイルしてくれることになる。

って先輩が言ってた(他責的発言)

なお、El Capitan でのセキュリティに関しては

Mac Fan 2016年2月号 [雑誌]

Mac Fan 2016年2月号 [雑誌]

にて2ページくらいで解説されていたので参考されると良いかも。