提问者:小点点

sudo-H做什么?


在尝试使用pip安装virtualenv之后

$ pip install virtualenv

我得到了一个许可拒绝错误

IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/virtualenv.py'

所以我用sudo安装了virtualenv

$ sudo pip install virtualenv

但随后出现了一个警告:

目录“/Users/petertao/Library/Caches/pip/http”或其父目录不属于当前用户,缓存已被禁用。请检查该目录的权限和所有者。如果使用sudo执行pip,您可能需要sudo的-H标志。

目录/用户/petertao/库/缓存/pip或其父目录不属于当前用户,缓存轮已被禁用。检查该目录的权限和所有者。如果使用sudo执行pip,您可能需要sudo的-H标志。

sudo的-H标志有什么作用?


共2个答案

匿名用户

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设置为什么,而sudo-H也会将变量从“my”HOME目录更改为root的HOME目录。

pip警告您,它是作为root用户执行的,并希望修改$HOME中的内容,该$HOME设置为“/Users/petertao”,它不属于root用户(很可能是“petertao”用户)。警告表示pip使用$HOME缓存文件,但由于文件夹所有权不一致,已禁用其自身的缓存。

当然,在以root身份执行时,pip可以修改“/Users/petertao/Library/Caches/pip”,因为root(几乎)万能。这以后可能会变得很麻烦,因为没有root的程序无法再覆盖或修改这些文件。相反,pip拒绝写入另一个用户拥有的目录。

匿名用户

-h标志通常意味着人类可读的格式,它是Linux操作系统中方便的内置转换。例如,在我的例子中,如果您在Linux中使用命令终端,则使用raspberry pi并键入df。这将显示已使用和可用的内存。它将显示您有448336个字节。你可能喜欢,嗯,这让人困惑。现在输入df-h(使用-h标志),您应该得到这样的结果448M,而不是4488336字节。