如何使用apt-get升级单个软件包?

如何更新单个软件包?根据man apt-get所说,apt-get upgrade不接受软件包/软件包列表作为参数:
升级用于从/etc/apt/sources.list中列出的源安装系统上当前已安装的所有软件包的最新版本。将检索并升级当前已安装的具有新版本可用的软件包;绝不会删除当前已安装的软件包,也不会检索和安装尚未安装的软件包。无法在不更改其他软件包的安装状态的情况下升级当前已安装的软件包的新版本将保留在其当前版本。必须首先执行更新操作,以便apt-get知道软件包的新版本可用。
7个回答

你只需要执行 apt-get install --only-upgrade <packagename> 命令。这将仅升级指定的软件包,前提是它已经安装了。
如果你希望在软件包不存在时进行安装,或者在其已存在时进行升级,可以省略 --only-upgrade 参数。

2@Raphink:你对升级的评论是正确的,但是安装被视为等同于升级一个软件包;安装后面跟着一个或多个要安装或升级的软件包。如果你有更好的答案,可以回答这个问题。那将会很棒。 - Binarylife
104apt-get install --only-upgrade <packagename> 不会安装任何新的软件包。 - taneli
14如果需要,install 命令会升级该单个软件包的依赖项吗? - Pino
13@Pino 没错,这样做是有道理的。如果你要升级的版本依赖于另一个软件包的更新版本,那该怎么办呢?如果你不同时升级两者,那就会出问题。这就是为什么使用install命令是正确的选择,即使它看起来有些违反直觉。 - Matt Dodge
更新后需要重新启动吗?我的软件包仍然显示相同的版本。 - CMCDragonkai
1假设依赖项也被升级了,那么使用共享依赖项的应用程序会出现问题吗? - Ahmed
12这会移除“自动”标记吗?有时候当你安装库的时候,特别是包被标记为手动安装。因此,我不喜欢对库运行“安装”操作。 - isaaclw
适用于Ubuntu 16.04,也就是说 apt install --only-upgrade install <package> - Nasik Shafeek
2在这里,“--only-upgrade”是无用的。只需使用“install”命令就可以升级软件包。 - Anwar
7我刚刚测试了一下,由于所有信息都相当模糊;在Ubuntu 16.04(apt 1.0.1)上,使用apt install升级软件包不会影响auto标记,无论是否提供--only-upgrade。当然,如果您不想意外安装新软件,则使用--only-upgrade是有意义的。它还将升级任何必需的依赖项。 - dualed
2@isaaclw 添加 --only-upgrade 标志可以确保软件包未设置为手动安装(Ubuntu 20.04) - Fadi
@Anwar,绝对不是无用的,请看我的上一条评论。 - Fadi

为了使用命令行界面更新单个软件包:
sudo apt-get install --only-upgrade <packagename>

例如,sudo apt-get install --only-upgrade ack
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Skipping **ack**, it is not installed and only upgrades are requested.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

12我在使用这个命令时遇到了一个错误:E: 无法理解仅限Sense,尝试true或false。 - Michael
1对于遇到前面评论者的错误的人,请参见下面的我的回答 - golem
5因为它没有提供新的信息,所以被投下了反对票。 - gokul_uf
1你应该将 --only-upgrade 添加到 install 子命令中,而不是直接添加到 apt-get,这样就不需要再附加 true 了。 - Ruslan

我能想到两种可能的方法:

  1. sudo apt-get install 包名

    即使已经安装,此命令也会升级该软件包:

    ~$ sudo apt-get install emesene
    正在读取软件包列表... 完成
    正在建立依赖树       
    正在读取状态信息... 完成
    下列软件包将被升级:
      emesene
    升级了 1 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 5 个软件包未被升级。
    需要下载 1,486 kB 的归档文件。
    此操作之后,将释放 696 kB 的磁盘空间。
    获取:1 http://il.archive.ubuntu.com/ubuntu/ natty-updates/universe emesene all 2.11.4+dfsg-0ubuntu1 [1,486 kB]
    
  2. 使用Synaptic Package Manager右键点击→标记为升级

    enter image description here

    注意:有时可能会要求安装其他软件包或依赖项,这是正常的。


1是的,应该可以。而且sudo apt-get install whatever应该会自动进行升级。 - Binarylife
4升级不需要包参数。 - raphink
1sudo apt-get install nameofpackage 将升级软件包,并将其设置为“手动安装”,以防它仅作为依赖项安装。这并不总是理想的,因为它会限制后续使用 sudo apt autoremove 的效果。 - tanius

根据我在Ubuntu 12.04 LTS上的经验,如果使用单独的PPA,使用下面的命令将不会升级软件包 -
sudo apt-get --only-upgrade install <packagename>

同样地,我不想运行升级命令,这会升级服务器上的所有软件包 -
sudo apt-get dist-upgrade

例如,我已经安装了PHP 5.3,并使用ondrej PPA将其添加到我的apt.sources中。
sudo add-apt-repository ppa:ondrej/php5

如果我跑步
sudo apt-get install php5

它只会重新安装 PHP 5.3。

首先,我必须确定要升级到的版本号,使用

sudo apt-cache policy php5

这将列出所有可用的版本号。您应该找到要升级的版本号,然后复制引用它的整个字符串。例如,在Ubuntu上,PHP 5.5的字符串是"5.5.16+dfsg-1+deb.sury.org~precise+2"。
现在,您可以使用特定的版本号运行apt-get install命令,然后就完成了!
sudo apt-get install php5=5.5.16+dfsg-1+deb.sury.org~precise+2

我只是添加了这个,因为我在其他地方找不到这个信息!

我想对一些人来说这是显而易见的,但如果上述的apt-get install命令失败并显示无法获取某些存档的消息,你可能需要先运行apt update,然后重新运行apt-cache policy来确定最终install命令所需的正确版本。 - CODE-REaD

在Ubuntu 9.04 Jaunty上,
apt-get --only-upgrade install <package>

产量:

E: Sense only is not understood, try true or false.

命令
apt-get --only-upgrade true install <package>

在我的情况下起作用了。

10你应该将 --only-upgrade 传递给 install 子命令,而不是直接传递给 apt-get,这样你就不需要再添加 true - Ruslan

对于一个命令行解决方案,如果软件包不存在,则不安装该软件包。
dpkg -s <package> 2>/dev/null | grep -q Status.*installed && sudo apt-get install <package>

这可以很容易地制作成一个脚本,例如:

upgrade-package.sh:

#!/bin/bash

[[ -z $1 ]] && { echo "Usage: $(basename $0) package"; exit 1; }

if dpkg -s "$1" 2>/dev/null | grep -q Status.*installed; then
    echo "Attempting to upgrade $1"
    sudo apt-get install "$1"
else
    echo "Package $1 is not installed"
fi

在Ubuntu 18.04 LTS上升级单个软件包的方法是:
sudo apt update && sudo apt install --only-upgrade <packagename>

升级多个软件包的方法如下:
sudo apt update && sudo apt install --only-upgrade <package1> <package2> <package3>