![sudo -E 在这里如何工作?](https://linux22.com/image/60463/sudo%20-E%20%E5%9C%A8%E8%BF%99%E9%87%8C%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我执行了以下命令在 Ubuntu 中添加 ppa 存储库:
sudo add-apt-repository ppa:ppaname/ppa
此命令返回错误,指出 ppa 名称格式不正确。然后我看了看这里因此,运行以下命令:
sudo -E add-apt-repository ppa:ppaname/ppa
上面的命令就像魔术一样起作用。然后我阅读了手册页,sudo
其中说sudo -E
保留环境变量。我不明白的是,保留环境变量对我有什么帮助?
注意:我在代理后面工作。
答案1
如果您使用代理进行互联网连接,也许您的系统为您的用户设置了一些环境变量来设置代理服务器IP。当您使用不带-E
选项的 sudo 时,您的环境变量不会保留,因此您无法连接到互联网,导致add-apt-repository
显示该错误。查看add-apt-repository
源码,可以看到:
try:
ppa_info = get_ppa_info_from_lp(user, ppa_name)
except HTTPError:
print _("Cannot add PPA: '%s'.") % line
if user.startswith("~"):
print _("Did you mean 'ppa:%s/%s' ?" %(user[1:], ppa_name))
sys.exit(1) # Exit because the user cannot be correct
# If the PPA does not exist, then try to find if the user/team
# exists. If it exists, list down the PPAs
_maybe_suggest_ppa_name_based_on_user(user)
sys.exit(1)
因此,如果您无法连接到互联网,_maybe_suggest_ppa_name_based_on_user()
将会被呼叫。这是它的实现:
def _maybe_suggest_ppa_name_based_on_user(user):
try:
from launchpadlib.launchpad import Launchpad
lp = Launchpad.login_anonymously(lp_application_name, "production")
try:
user_inst = lp.people[user]
entity_name = "team" if user_inst.is_team else "user"
if len(user_inst.ppas) > 0:
print _("The %s named '%s' has no PPA named '%s'"
%(entity_name, user, ppa_name))
print _("Please choose from the following available PPAs:")
for ppa in user_inst.ppas:
print _(" * '%s': %s" %(ppa.name, ppa.displayname))
else:
print _("The %s named '%s' does not have any PPA"
%(entity_name, user))
except KeyError:
pass
except ImportError:
print _("Please check that the PPA name or format is correct.")
可以看到,Please check that the PPA name or format is correct
如果无法导入的话会显示信息Launchpad
。你需要安装python-launchpadlib才能使导入成功。
笔记
我认为报告该消息是不明确的,因为何时launchpadlib
也需要互联网连接才能工作。在这种情况下,脚本应该检查互联网连接是否断开,以便更清楚地报告。