当我使用 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 markauto
或aptitude 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
技巧这里。