使用 apt-get 安装依赖项,如果已安装则不将其独立化

使用 apt-get 安装依赖项,如果已安装则不将其独立化

当我使用 apt-get 意外地安装一个已经作为另一个包的依赖项安装的包时,它会通过将包标记为 而manual不是 来破坏这种“依赖性” auto

我可以稍后使用 手动修复此问题sudo apt-mark markauto package-name

有没有办法告诉 apt-get(或 aptitude、dpkg 或其他工具)首先不要破坏链接,或者如果请求的包已经安装则不执行任何操作?

我遇到过几种不同的情况:

我有一个要安装的软件包列表,以使某些特定的工作(来自类似此网站上的说明)。

我有一个添加到一个安装的所有软件包的列表,我复制它,以便它们全部添加到另一个安装中 - 例如,当我进行全新安装而不是升级系统时。

答案1

你说

当我使用 apt-get 意外地安装一个已经作为另一个软件包的依赖项安装的软件包时,它会通过将软件包标记为而manual不是来破坏该“依赖关系”。auto

我认为你有点搞错了。它不会破坏依赖链。其他包仍然依赖于此标记为手动包。唯一受影响的是,如果你现在运行apt-get autoremove这些标记为手动软件包不会被删除。因为apt标记为手动意味着用户故意安装它们,而不是因为用户想要其他依赖于这些软件包的软件包。

你问

有没有办法告诉 apt-get(或 aptitude、dpkg 或其他工具)首先不要破坏链接,或者如果请求的包已经安装则不执行任何操作?

到目前为止,我还没有找到任何可以自动执行此操作的工具。但这听起来也不合逻辑。因为在这种情况下,您安装的每个软件包都会变得automatically installed容易受到apt-get autoremove命令的攻击。

因此,如果您希望某些包被标记为自动安装尽管是手动安装,您仍然必须使用apt-get markautoaptitude mark-auto

答案2

如果无法使用现有工具执行此操作,则可以使用以下解决方法。

通过如下 bash 脚本运行每个包:

#!/bin/bash
dpkg -s "$1" &> /dev/null
(($?)) && sudo apt-get install "$1"

dpkg -s如果包(作为脚本的参数给出)已安装,则返回 0;如果未安装,则返回 1。如果包已安装,则此脚本将不执行任何操作,如果未安装,则安装包 - 避免了原始问题。

dpkg命令输出了一堆这里不需要的信息,因此将其重定向/dev/null到位桶中以摆脱它。

(($?))查看来自的返回代码dpkg。它的工作原理类似于 C - 与常规 bash 测试相反。如果$?由于未安装包而为 1,则将评估为 true 并触发&&安装包的子句。

根据需要,可以将其制成一个函数和/或放置在包名称列表的循环中。

如果使用频率很高,那么还会添加代码来验证参数$1不为空且不包含嵌入的空格或其他垃圾。但所有这些都只是普通的脚本,而不是解决方案本身的一部分。

我找到了这个dpkg技巧这里

相关内容