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


826

如何更新单个软件包?至于man apt-get说,apt-get upgrade不拿包作为参数的包/列表:

升级

upgrade用于从中枚举的源安装系统上当前安装的所有软件包的最新版本 /etc/apt/sources.list。当前安装有可用新版本的软件包将被检索和升级;在任何情况下都不会删除和安装尚未安装的软件包或尚未安装的软件包。当前安装的软件包的新版本,如果不更改其他软件包的安装状态而无法升级,将保留其当前版本。必须首先执行更新,以便apt-get知道有新版本的软件包可用。

Answers:


1026

您只需要做apt-get install --only-upgrade <packagename>。这将仅升级该单个软件包,并且仅在已安装的情况下进行升级。

如果您希望安装该软件包(如果该软件包不存在)或对其进行升级,则可以省去--only-upgrade


88
apt-get install --only-upgrade <packagename>不会安装任何新软件包
taneli 2012年

9
install如有必要,命令还会升级单个软件包的依赖性吗?
皮诺(Pino)

7
@Pino这样做很有意义。如果要升级到的版本依赖于另一个软件包的较新版本怎么办?如果您不同时升级两者,那您将大受打击。这就是为什么install即使这样做似乎违反直觉,也是正确的命令的原因。
马特·道奇

6
这会删除“自动”标记吗?有时,当您专门安装库时,该软件包会标记为手动安装。因此,我不喜欢在库上运行“安装”。
isaaclw

3
我刚刚进行了测试,因为所有信息都非常模糊。在Ubuntu 16.04(apt 1.0.1)上,使用升级软件包apt install不会影响auto标记(无论是否--only-upgrade提供)。当然--only-upgrade,如果您不想意外安装新的东西,使用当然很有意义。它还将升级任何必需的依赖项。
加倍

129

为了使用CLI更新单个软件包:

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.

11
我收到此命令错误:E: Sense only is not understood, try true or false.
Michael

1
对于那些遇到前一个评论者错误的人,请参阅下面的我的回答
golem


1
您应该传递--only-upgradeinstall子命令,而不是直接传递给apt-get,则不必附加true
Ruslan

55

我可以想到两种方法:

  1. sudo apt-get install nameofpackage

    即使已经安装,这也会升级软件包:

    ~$ sudo apt-get install emesene
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following packages will be upgraded:
      emesene
    1 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
    Need to get 1,486 kB of archives.
    After this operation, 696 kB disk space will be freed.
    Get:1 http://il.archive.ubuntu.com/ubuntu/ natty-updates/universe emesene all 2.11.4+dfsg-0ubuntu1 [1,486 kB]
    
  2. 使用Synaptic Package Manager右键单击→标记为升级

    在此处输入图片说明

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


1
是的,它应该并且sudo apt-get install whatever应该自行升级。
Binarylife

4
upgrade不带包参数。
ℝaphink

25

根据我在Ubuntu 12.04 LTS上的经验,如果使用单独的PPA,则使用以下命令不会升级软件包-

sudo apt-get --only-upgrade install <packagename>

同样,我也不想运行upgrade命令,该命令将升级服务器上的所有软件包-

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

我仅添加了此内容是因为我无法在其他任何地方找到此信息!


16

在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>

就我而言。


4
您应该传递--only-upgradeinstall子命令,而不是直接传递给apt-get,则不必附加true
Ruslan

10

对于不存在该软件包的命令行解决方案:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.