“sudo apt-get update” 是什么意思?

我想知道sudo apt-get update命令是做什么的?
它更新了什么内容?
9个回答

简而言之,apt-get update并不实际安装新版本的软件。相反,它更新软件包列表以获取需要升级的软件包以及刚刚添加到存储库中的新软件包。
  • apt-get update 从软件源下载软件包列表并将其“更新”,以获取有关软件包及其依赖项的最新版本信息。它将为所有软件源和PPA执行此操作。 来自http://linux.die.net/man/8/apt-get

    用于重新同步软件包索引文件与其源之间的关系。可用软件包的索引从/etc/apt/sources.list(5)中指定的位置获取。在进行升级或发行版升级之前,应始终执行更新操作。

  • apt-get upgrade 将获取机器上已知的新版本软件包(通过apt-get update)。

    来自http://linux.die.net/man/8/apt-get

    用于从/etc/apt/sources.list(5)中列出的源安装当前系统上所有软件包的最新版本。将检索并升级当前已安装的具有新版本的软件包;绝不会删除当前已安装的软件包,也不会检索并安装尚未安装的软件包。无法在不更改其他软件包的安装状态的情况下升级的当前已安装软件包的新版本将保持其当前版本。 [强调是我的] 必须先执行更新操作,以便apt-get知道有新版本的软件包可用。

  • apt-get dist-upgradeapt中相当于full-upgrade)将执行与apt-get upgrade相同的操作,并智能处理依赖关系,因此可能会删除过时的软件包或添加新的软件包。请参见:什么是“dist-upgrade”,为什么它比“upgrade”升级更多内容?

    来自http://linux.die.net/man/8/apt-get

    除了执行升级功能外,此选项还智能处理与软件包新版本的更改依赖关系;apt-get具有“智能”冲突解决系统,如果必要,它将牺牲不太重要的软件包而升级最重要的软件包。 /etc/apt/sources.list(5)文件包含一个位置列表,用于检索所需的软件包文件。有关覆盖个别软件包的一般设置的机制,请参见apt_preferences(5)。

你可以使用&&将命令组合起来,如下所示:
sudo apt-get update && sudo apt-get install foo bar baz foo-dev foo-dbg

或者根据依赖项的版本要求获取最新的版本:
sudo apt-get update && sudo apt-get dist-upgrade

你需要两次使用sudo,但是由于sudo默认情况下在上一次sudo操作后的5分钟内不会提示你,所以你只需输入一次密码(或者根本不需要输入)。

18每当我们安装软件包时,我们是否总是需要运行 sudo apt-get update 命令?如果不这样做有什么缺点? - JohnnyQ
22@JohnnyQ 如果你不运行那个命令,可能会安装一个过时的软件包。 - nanofarad
1啊,听起来这只是一个惯例的事情。所以我猜如果你只是使用基本包和基本命令,而且通常不会更新的话,那么它真的不是那么必要。问题在于我的情况是apt-get update需要一段时间,这里的互联网还比较原始。 - JohnnyQ
@JohnnyQ 对于某些软件包来说,确保你的软件包列表是最新的非常重要。这类软件包包括安全关键的软件。 - nanofarad
3@JohnnyQ,如果你的apt-get update很慢,那么apt-get dist-upgrade也会很慢,所以这并不是不先执行apt-get update的理由。顺便说一下,你可以通过查看文件夹/etc/apt/sources.d/来加快apt-get update的速度,看看是否添加了任何自定义仓库,其中可能有一个无响应,这将减慢整个更新过程的速度。 - Mladen B.
3顺便说一句,“apt”代表高级包管理工具(https://wiki.debian.org/Apt "什么是APT?")。这是我前几天学到的东西,想和大家分享一下。(在man apt-get、man apt中经常出现“apt”,但我以前从未见过这个缩写的完整解释)。 - jgreve
为什么不让升级操作与完全升级(dist-upgrade)相同呢?很多人只使用升级操作,导致系统版本滞后。 - izk9
@izk9 我不确定为什么他们没有只使用一个命令并带有标志来更严格地保留升级。这可能是向apt设计者提出的问题。 - nanofarad

通过谷歌搜索或者在终端中使用--help命令,你几乎可以找到任何终端命令的定义。例如,
apt-get --help

sudo apt-get update基本上有三个部分:

sudo

以超级用户(root)权限执行以下命令。许多需要修改系统文件或安装应用程序的操作需要额外的权限才能完成。
apt-get

apt 是 Ubuntu 使用的命令行工具,用于安装、删除和管理软件包。
update

"

是apt-get程序的一个选项,用于从互联网上的服务器更新软件包列表。软件包列表为apt-get工具提供了关于可使用apt-get安装的软件包的重要信息。当给出安装命令时,apt-get使用这些列表来确定要安装哪个软件。例如

"
sudo apt-get install guake

我会安装Guake终端,因为它目前在我的计算机的本地软件列表中。然而,这可能不是适当的版本,或者如果程序是新的,可能根本不可用。因此,在使用apt-get安装软件时,通常要键入
sudo apt-get update
sudo apt-get install <package>

确保apt-get知道安装软件包的最新版本。
另一个有用的信息来源是help.ubuntu.com网站。例如,如果你在该网站上搜索apt-get,你会发现AptGet/Howto作为其中之一的结果。

Alex,我可以基本上像你所写的那样使用这个命令吗: "apt-get update apt-get install <package>"基本上只需将这两个命令一起输入就可以执行这两个操作吗? - Elysium
1@Elysium 是的,如果你在它们之间使用 &&,就像这样 sudo apt-get update && sudo apt-get install foo bar baz - nanofarad
10使用 && 表示只有在第一个命令成功运行后,第二个命令才会执行。如果你不关心第一个命令的成功与否,可以使用 ; 替代。 - Flimm
5通过谷歌搜索,我找到了这个问题/答案。仅供参考 ;) - teewuane
有人知道为什么这不会在每次启动时自动执行,或者在cron中执行吗?看起来像是一个额外的管理员步骤。 - Dan Chase
1@DanChase reddit: "sudo apt-get update"在启动时是个好主意还是坏主意?为什么?有一个不错的讨论,解释了为什么不应该在启动时运行apt-get update。基本上:不要在没有我的同意下更新我的系统。然而,如果你想要这种行为,你可以在cron中添加一个脚本。 - Metro Smurf

运行`sudo apt-get update`只是确保您的所有存储库和PPA的软件包列表是最新的。如果您不运行此命令,您可能会安装旧版本的各种软件包,或者更糟糕的是,出现依赖问题。如果您刚刚添加了一个PPA并且没有更新,那么来自该PPA或存储库的任何内容都将无法正常工作,因为您没有该PPA或存储库的软件包列表。
简而言之:强烈建议在安装之前运行`sudo apt-get update`,但如果您真的时间紧迫,可以跳过此步骤,除非您自上次`apt-get update`以来更改了存储库或PPA。

谢谢。如果我要安装多个软件包,例如两个,我需要执行apt-get update两次还是只需要一次?这个update是针对所有软件包还是之后的那些软件包?(如果我的问题表达清楚的话) - Robert Sinclair
1@RobertSinclair 一次就够了 - 它会从所有仓库中获取软件包列表。第二次运行 sudo apt update 不会有任何新的变化,除非你添加一个仓库,或者仓库的维护人员添加/更新了仓库中的软件包。 - nanofarad

它会更新您计算机上的可用软件列表。

您的计算机有一个包含Ubuntu服务器上所有可用软件的列表(类似于目录)。但是可用软件和版本可能会发生变化,因此“更新”将访问服务器并查看可用的软件以更新其本地列表(或目录)。

请注意,“更新”与“升级”是不同的。如上所述,更新将获取可用的软件并更新列表,而“升级”将安装计算机上已安装软件的新版本(实际软件更新)。

要实际升级软件(而不是“更新”列表),请执行以下命令

sudo apt-get upgrade

通常在“更新”之后执行。

在安装新软件包之前,您需要运行一次 apt-get update 命令,因为这会更新本地仓库信息。

如果您打算连续安装多个软件包,每次安装之前都不需要运行 apt-get update 命令;只需要在第一个安装之前运行一次即可。

另外,如果您键入 sudo apt-get install package1 package2...,您可以同时安装多个软件包,但是在安装多个软件包之前仍然需要先运行 apt-get update 命令。


不错的技巧! - Emerson Hsieh

当您使用命令行安装软件包时,使用sudo apt-get install ...(或sudo aptitude install ...),或者在命令行中升级它们(使用upgradedist-upgrade而不是install),以下信息是从您本地系统的配置获取的,而不是从互联网获取的:
  1. 有哪些可用的软件包

  2. 它们的可用版本

  3. 可用软件包应该从哪里获取

运行sudo apt-get update(或sudo aptitude update)会更新您本地系统上的这些信息。这一步实际上是从互联网源获取关于可以安装哪些软件包的信息,包括当前已安装软件包的可用更新
当您使用图形界面安装软件包(更新管理器、软件中心或Synaptic软件包管理器)时,sudo apt-get update的工作会自动完成。但是,如果您通过命令行安装软件包,则不会自动完成,您应该始终自己执行此操作,除非您最近已经这样做过。
由于获取有关可用软件包的更新版本的信息是通过运行sudo apt-get update(或sudo aptitude update)来完成的,因此建议在安装任何软件包之前运行此命令,并且在安装最新更新时必须运行它,即使您没有添加或删除任何软件源(例如PPA)。
请注意,如果您打算在同一时间进行多个软件包管理操作,则不需要在每个操作之前运行sudo apt-get update。只有在信息长时间未更新时,您才需要确保运行此命令。

就像之前许多人所说的那样,这会更新您的本地仓库(软件包列表)。

如果您尝试安装可能会遇到麻烦。

apt-get install foobar

和 foobar 或依赖项在存储库中没有最新版本。如果手动安装.deb文件或来自第三方的ppa,这可能会导致特别的问题。
基本上,它确保“你的列表”与“主列表”匹配。

正如Eliah Kagan在上面提到的,你会期望一个图形用户界面应用程序在运行apt-get install / apt-get upgrade之前运行apt-get update,但是我刚刚发现了一个有趣的404错误,在一个相对较新的offensive-security虚拟机上,这让我困惑了一分钟。
从命令行中,我运行了apt-get update,然后再次尝试了系统工具/软件更新命令,这次它没有出现404错误。
所以,我猜你不能总是假设apt-get update会从图形用户界面应用程序中运行...

有趣...也许在你和服务器之间存在一些不寻常的网络情况,这种情况在你运行apt-get时比通过运行软件更新器/更新管理器执行的自动检查更好处理。你使用HTTP代理吗?你能再次重现这个问题吗,还是只发生了一次?如果这只是一个孤立的异常,我想可能是由于临时服务器配置错误导致的问题。你使用哪个镜像?如果有更多信息,也许我可以改进我的回答。(顺便问一下,这是作为一个独立的回答,还是应该转换为评论?) - Eliah Kagan

让我们以在Ubuntu上安装VLC媒体播放器为例进行考虑:
sudo apt-get update

它将检查存储库中是否有可用的更新。
然而,
sudo apt-get install vlc vlc-plugin-pulse mozilla-plugin-vlc

将从我们搜索的存储库中安装VLC媒体播放器。
如果您以root用户(管理员)身份登录,您不必使用sudo,因为您已经拥有超级用户权限。