sudo -E 在这里如何工作?

sudo -E 在这里如何工作?

我执行了以下命令在 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也需要互联网连接才能工作。在这种情况下,脚本应该检查互联网连接是否断开,以便更清楚地报告。

相关内容