什么sudo -H做什么?

Pet*_*Tao 42 python terminal sudo pip virtualenv

尝试用pip安装virtualenv之后

$ pip install virtualenv
Run Code Online (Sandbox Code Playgroud)

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

IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/virtualenv.py'
Run Code Online (Sandbox Code Playgroud)

所以我用sudo来安装virtualenv

$ sudo pip install virtualenv
Run Code Online (Sandbox Code Playgroud)

但随后出现了警告:

目录'/ Users/petertao/Library/Caches/pip/http'或其父目录不归当前用户所有,并且已禁用缓存.请检查该目录的权限和所有者.如果用sudo执行pip,你可能需要sudo的-H标志.

目录'/ Users/petertao/Library/Caches/pip'或其父目录不归当前用户所有,并且已禁用缓存轮.检查该目录的权限和所有者.如果用sudo执行pip,你可能需要sudo的-H标志.

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

use*_*593 69

通常

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
Run Code Online (Sandbox Code Playgroud)

你可以看到普通的sudo改变了我从"testuser"到"root"的用户,而不是$ HOME设置的用户,而sudo -H也将变量从"my"主目录更改为root的主目录.

在你的情况下

pip警告你它是以root用户身份执行的,并希望修改$ HOME中的内容,该内容设置为'/ Users/petertao',而不是root用户(很可能是"petertao"用户).警告表明pip使用$ HOME来缓存文件,但由于文件夹所有权差异而禁用了自己的缓存.

当然,作为root pip执行时可以修改'/ Users/petertao/Library/Caches/pip',因为root(几乎)是全能的.这可能会变得麻烦,因为没有root运行的程序不能再覆盖或修改这些文件.相反,pip拒绝写入另一个用户拥有的目录.

  • 那么有什么理由不使用"sudo -H"或是对保守派的警告?基于你的详细解释,似乎我们应该总是使用-H但是来自pip的警告是"你__may__想要使用sudo -H"而不是"使用sudo时启用缓存请使用-H" (10认同)
  • 你能在这里解释一下双引号和单引号之间的区别吗?我尝试了 `sudo -H bash -c "echo $HOME $USER"` 和 `sudo -H bash -c 'echo $HOME $USER'` 并且这些命令给出了不同的结果:`/home/ubuntu ubuntu` 和 `/根根`分别。我曾经认为引号之间没有区别。 (2认同)
  • @through.a.haze /sf/ask/468842741/ (2认同)