pipでvirtualenvをインストールしようとした結果
$ pip install virtualenv
パーミッションデッドエラーが発生しました
IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/virtualenv.py'
そこで、sudo を使って virtualenv をインストールしました。
$ sudo pip install virtualenv
と思ったら、警告が表示された。
The directory '/Users/petertao/Library/Caches/pip/http' or its parent ディレクトリは、現在のユーザーによって所有されておらず、キャッシュが無効になっています。 を無効にしています。そのディレクトリのパーミッションと所有者を確認してください。もし sudoでpipを実行する場合、sudoの-Hフラグが必要です。
ディレクトリ '/Users/petertao/Library/Caches/pip' またはその親ディレクトリの所有者がいません。 ディレクトリは、現在のユーザーによって所有されておらず、キャッシングホイールも無効になっています。 そのディレクトリのパーミッションと所有者を確認してください。もし sudoでpipを実行する場合、sudoの-Hフラグが必要です。
**sudo's -Hフラグは何をするのでしょうか?
man sudo
(正確なテキストは異なるかもしれませんが、似たようなものでしょう)。
-H
-H (HOME) オプションは、セキュリティポリシーが HOME 環境変数を、パスワードデータベースで指定された対象ユーザー (デフォルトでは root) のホームディレクトリに設定するよう要求します。ポリシーによっては、これがデフォルトの動作となる場合もあります。
では、なぜこのようなオプションがあるのでしょうか? 通常、"sudo" を使用しても $HOME 環境変数は変更されません。
例えば
echo $HOME $USER
/home/testuser testuser
sudo bash -c 'echo $HOME $USER'
/home/testuser root
sudo -H bash -c 'echo $HOME $USER'
/home/root root
通常の sudo は、私がどのユーザであるかを "testuser" から "root" に変更しますが、$HOME の設定値には変更しません。
pip はユーザ root として実行され、$HOME を '/Users/petertao' に設定し、root (おそらく "petertao" ユーザ) が所有しないものを変更しようとしたと警告を出しています。 この警告は、pip がファイルをキャッシュするために $HOME を使用しているが、フォルダの所有権の不一致のため、自身のキャッシュを無効にしていることを示します。
もちろん、rootで実行中のpipは '/Users/petertao/Library/Caches/pip' を変更することができます。rootは(ほとんど)全能なので。 これは後で面倒なことになります。なぜなら、root 以外で実行されているプログラムは、これらのファイルを上書きしたり変更したりできなくなるからです。 その代わり、pip は他のユーザが所有するディレクトリに書き込むことを拒否します。