apt 和 apt-get 都用于管理基于 Debian 的系统上的软件包。它们访问相同的软件包数据库,解析相同的依赖关系,并从相同的软件源获取软件包。然而,它们是两个独立的工具,在错误的场景下选择错误的工具可能会带来一些小麻烦。简而言之:apt 面向终端用户,apt-get 面向脚本。

本指南将解释 apt 和 apt-get 的区别、何时使用哪一个,以及它们的命令如何相互对应。

为什么存在两个工具

自 1998 年以来,apt-get 一直是标准的 Debian 软件包管理器。它可靠且文档完善,但其界面设计于终端可用性不受重视的时代。搜索和查看软件包详情等相关任务位于一个名为 apt-cache 的单独工具中,因此用户经常需要在这两个工具之间切换。

apt 命令在 Debian 8 和 Ubuntu 14.04(APT 版本 1.0,发布于 2014 年)中引入,作为一个用户友好的前端。它将最常见的 apt-get 和 apt-cache 操作合并为一个命令,添加了进度条,并默认使用彩色输出。

这两个工具都属于同一个 apt 软件包,并共享相同的底层库。安装其中一个总是会安装另一个。

面向用户的差异

当你在终端中运行 apt install 时,你会注意到 apt-get 没有的一些功能:

  • 屏幕底部的进度条显示整体下载和安装进度。
  • 新安装的软件包在输出中会高亮显示。
  • apt update 完成后会显示可升级软件包的数量。
  • 当连接到终端时,输出会以彩色格式显示。

这些功能使 apt 在交互使用时更令人愉悦。但它们也使得其输出对脚本来说不太可预测,因为格式可能在 APT 版本之间毫无预警地改变。apt 的手册页直接警告了这一点:该界面专为最终用户设计,其行为可能在版本之间发生变化,不保证向后兼容,因此不建议在脚本中使用。

另一方面,apt-get 是更安全的自动化接口。专用的 APT 工具尽可能保持向后兼容性,这就是为什么 Ansible、Docker 和 CI 流水线等自动化工具使用 apt-get 而不是 apt 的原因。

命令比较

下表将最常见的 apt 命令映射到它们对应的 apt-get 或 apt-cache 命令:

任务aptapt-get / apt-cache
更新软件包索引apt updateapt-get update
升级所有软件包apt upgradeapt-get upgrade --with-new-pkgs
完整升级(可能移除软件包)apt full-upgradeapt-get dist-upgrade
安装软件包apt install pkgapt-get install pkg
移除软件包apt remove pkgapt-get remove pkg
移除并清除配置文件apt purge pkgapt-get purge pkg
移除未使用的依赖apt autoremoveapt-get autoremove
搜索软件包apt search keywordapt-cache search keyword
显示软件包详情apt show pkgapt-cache show pkg
列出已安装的软件包apt list --installeddpkg --list
列出可升级的软件包apt list --upgradable(无直接等价命令)
编辑软件源列表apt edit-sources(手动编辑文件)

如你所见,apt 将 apt-get 和 apt-cache 合并为一个工具,并添加了一些便捷命令,如 apt list 和 apt edit-sources,这些命令在 apt-get 中没有直接等价物。

一个重要的细节是 upgrade:apt upgrade 可以在必要时安装新的依赖软件包,而普通的 apt-get upgrade 会保留这些升级。当你想要更接近 apt-get 的等价命令时,请使用 apt-get upgrade --with-new-pkgs。

何时使用 apt

在终端中进行日常交互工作时使用 apt。如果你正在安装软件包、检查更新或手动搜索软件源,apt 是更好的选择。进度条和更清晰的输出使跟踪正在发生的事情更容易。

例如,要更新软件包索引并升级所有软件包:

sudo apt update && sudo apt upgrade

要搜索软件包然后安装它:

apt search nginx
sudo apt install nginx

何时使用 apt-get

在 shell 脚本、Dockerfile、CI 流水线以及任何自动化工作流中使用 apt-get。稳定的输出格式意味着当系统升级到更新的 APT 版本时,你的脚本不会中断。

一个典型的 Dockerfile 使用 apt-get 并带有 -y 标志来跳过确认提示:

dockerfile
RUN apt-get update && apt-get install -y \
    curl \
    git \
    && rm -rf /var/lib/apt/lists/*

这同样适用于 Bash 脚本和配置管理工具。如果命令在没有人工查看输出的情况下运行,请使用 apt-get。

高级操作

以下命令既适用于 apt 也适用于 apt-get,但在 apt-get 下文档更完善且更成熟。在脚本和 Dockerfile 中,建议使用 apt-get 形式以保持一致性和稳定性。

  • apt-get install --no-install-recommends pkg - 安装软件包时不拉取推荐的(但非必需的)依赖。这在 Docker 镜像中被广泛使用,以保持镜像体积较小。
  • apt-get install --allow-downgrades pkg - 允许安装软件包的旧版本。
  • apt-get build-dep pkg - 安装从源码编译软件包所需的全部构建依赖。
  • apt-get source pkg - 下载源码包。
  • apt-get download pkg - 下载 .deb 文件而不安装它。
  • apt-get changelog pkg - 显示软件包变更日志。
  • apt-get clean / apt-get autoclean - 清除本地软件包缓存。

常见问题

apt-get 被弃用了吗?
没有。apt-get 正积极维护中,并与 apt 一起接收更新。APT 开发者已声明 apt-get 不会被移除。它仍然是脚本和自动化的推荐工具。

我可以用 apt 替换所有 apt-get 命令吗?
对于交互式终端使用,可以。对于脚本,不可以。apt 的输出格式不保证保持稳定,其界面可能在版本之间发生变化。在任何自动化工作流中坚持使用 apt-get。

apt install 与 apt-get install 有区别吗?
没有。两者使用相同的依赖解析器执行相同的安装,产生相同的结果。唯一的区别在于展示方式:apt install 显示进度条和彩色输出,而 apt-get install 打印纯文本、稳定的输出。

apt update 和 apt-get update 有区别吗?
两者都从相同的软件源刷新软件包索引。唯一的可见区别是 apt update 还会打印可升级软件包数量的摘要。

apt 和 apt-get 在性能上有区别吗?
没有。两者使用相同的库并以相同的方式解析依赖关系。唯一的区别是用户界面。安装和下载速度完全相同。

那 apt-cache 呢?它仍然需要吗?
对于交互式使用,apt search 和 apt show 替代了最常见的 apt-cache 操作。对于脚本或当你需要高级查询选项(如 apt-cache policy 或 apt-cache depends)时,你应该仍然直接使用 apt-cache。