![如何递归列出需要安装的包的依赖项?](https://linux22.com/image/1069551/%E5%A6%82%E4%BD%95%E9%80%92%E5%BD%92%E5%88%97%E5%87%BA%E9%9C%80%E8%A6%81%E5%AE%89%E8%A3%85%E7%9A%84%E5%8C%85%E7%9A%84%E4%BE%9D%E8%B5%96%E9%A1%B9%EF%BC%9F.png)
当执行此操作时apt install
,我会得到需要安装的软件包列表,位于以下行:
The following NEW packages will be installed:
如果没有,则继续,不提示。我尝试检索此列表,但如果没有,则会失败,因为安装将继续进行。我想获取此列表但不安装它。
我尝试了这样的事情:
apt-cache depends --recurse packagename | grep -v " " | sort -u
但是它给出了包括已安装的程序在内的完整列表。我想将其限制为需要安装的程序。
我知道我可以将上面的输出与
dpkg --get-selections
查看哪些已安装,哪些未安装,但这会涉及循环中的循环,并且两个列表都非常长。肯定有更优雅的方式来做到这一点。
谢谢您的任何建议。(这是我第一次在这里提问)
编辑:rdepends
我检查了这个问题中给出的 方法:递归依赖
这本来就是我想要的,只是它得到的列表与给出的列表不同apt install
。它甚至列出了可卸载的依赖项(如果软件包本身安装成功,则无法卸载)。我要找的是将apt
在给定软件包之前安装的软件包列表。无论如何,我不明白为什么列表不同。它应该是相同的结果,对吧?但既然不是,那么它就不是我想要的。但是,如果有人能向我解释为什么它们会给出不同的结果,我将不胜感激。
答案1
使用:apt -s install ...
传递该-s
选项会apt
导致它模拟安装,但实际上不会安装或修改任何内容。这显示了您在安装包时可以看到的内容apt
,包括引入了哪些包(如果有的话)来满足其(直接和间接)依赖关系。
例如,要了解安装apache2
包时会发生什么,您可以运行:
apt -s install apache2
这向你展示了将采取哪些步骤sudo apt install apache2
。
该-s
选项也可以拼写为--simulate
、--just-print
、--dry-run
、--recon
、中的任何一个--no-act
。因此,如果您看到(或写出)其中任何一个,它们的作用是相同的。
该-s
选项记录在man apt-get
而不是在man apt
(后者没有记录大多数功能和选项),但和都apt-get -s install ...
受apt -s install ...
支持。
您也可以使用 模拟其他动作-s
,例如remove
动作。
与apt
实际更改系统的命令不同,apt -s
以 root 身份运行是可选的,因此您可以省略sudo
。
答案2
似乎apt -s install
(从另一个答案) 可以满足您的需求。您可以考虑的其他工具是apt-rdepends
和apt-cache
。但是,它们列出了 中的不同软件包apt -s install
,因此使用哪个取决于您的需求。
apt
可能包括标记为“建议”和“推荐”的包,具体取决于您的配置。apt-rdepends
不排除其他软件包已经提供的软件包。假设您xyz-ng
安装了软件包,并且它提供了xyz
。apt-rdepends
列出它,xyz
因为它是依赖项,尚未安装,但apt
不需要安装,xyz
因为它是由已xyz-ng
安装的提供的。- 在上面的例子中,
xyz-ng
和xyz
会发生冲突。因此,xyz
如果不删除 ,则无法安装xyz-ng
。
- 在上面的例子中,
apt-cache
可能由于其他原因而包含不必要的包,例如其他架构(i386
)。
以下是使用apt-rdepends
输出管道传输到其他实用程序来清理包列表的示例:
package="whatever"
apt-rdepends \
--state-follow=NotInstalled --state-show=NotInstalled \
-f Depends -s Depends "$package" 2> /dev/null |
grep Depends\:\ |
sed -E 's@\ \(.*\)$@@ ; s@^\s+Depends\:\ @@' |
sort -u
aptitude
下面是使用管道输出清理包列表的示例:
package="whatever"
aptitude -s -y install "$package" |
sed -E -e '1h;2,$H;$!d;g' \
-e 's@(.*\n)+.*NEW\ packages\ will\ be\ installed:\n(.*\n).*RECOMMENDED but will NOT be installed:(\n.*)+@\2@' \
-e 's@(\{[a-z]\})?\ @\n@g' |
sort -u
答案3
你可以使用 aptitude 来实现这一点:
$ aptitude \
--safe-resolver --no-new-installs install <package>