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 命令:
| 任务 | apt | apt-get / apt-cache |
|---|---|---|
| 更新软件包索引 | apt update | apt-get update |
| 升级所有软件包 | apt upgrade | apt-get upgrade --with-new-pkgs |
| 完整升级(可能移除软件包) | apt full-upgrade | apt-get dist-upgrade |
| 安装软件包 | apt install pkg | apt-get install pkg |
| 移除软件包 | apt remove pkg | apt-get remove pkg |
| 移除并清除配置文件 | apt purge pkg | apt-get purge pkg |
| 移除未使用的依赖 | apt autoremove | apt-get autoremove |
| 搜索软件包 | apt search keyword | apt-cache search keyword |
| 显示软件包详情 | apt show pkg | apt-cache show pkg |
| 列出已安装的软件包 | apt list --installed | dpkg --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 nginxsudo apt install nginx何时使用 apt-get
在 shell 脚本、Dockerfile、CI 流水线以及任何自动化工作流中使用 apt-get。稳定的输出格式意味着当系统升级到更新的 APT 版本时,你的脚本不会中断。
一个典型的 Dockerfile 使用 apt-get 并带有 -y 标志来跳过确认提示:
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。