我想获取依赖于请求的包的包列表。例如,我想获取所有依赖于telnet
.我想出了这个脚本:
for i in `rpm -qa | sort`;
do rpm -qR $i | grep telnet > /dev/null;
if [ $? -eq 0 ]; then
echo $i;
fi;
done
还有更好的方法吗?
谢谢。
答案1
您需要的命令是:
rpm -q --whatrequires <packagename>
所以:
rpm -q --whatrequires telnet
从手册页
--whatrequires CAPABILITY Query all packages that require CAPABILITY for proper functioning.
答案2
不幸的是,rpm -q --whatrequires
有时还不够:
$ rpm -q --whatrequires perl-libwww-perl
no package requires perl-libwww-perl
$ rpm -e perl-libwww-perl
error: Failed dependencies:
perl(LWP) is needed by (installed) perl-XML-Parser-2.36-7.el6.x86_64
那是因为--whatrequires
将 a 作为其参数 功能名称,而不是一个 包裹名字。如果(通常是这样)一个 RPM 包只提供一个同名功能,那么将该包的名称作为--whatrequires
参数就可以了;但如果没有(如上面的perl-libwww-perl
例子),我们需要另一个解决方案。
解决方案#1:rpm --test -e
使用;给出--test
(“试运行”)选项-e
如果命令成功(实际上没有更改您的系统!),则没有依赖项:
$ rpm --test -e emacs-common && echo 'No dependencies!'
No dependencies!
;如果失败,您会得到我们上面已经看到的错误输出:
$ rpm --test -e perl-libwww-perl && echo 'No dependencies!'
error: Failed dependencies:
perl(LWP) is needed by (installed) perl-XML-Parser-2.36-7.el6.x86_64
解决方案#2:repoquery --installed --whatrequires
该repoquery(1)
命令作为yum-utils
RPM 的一部分提供,足以将包名称解析为功能名称,反之亦然:
$ repoquery --installed --whatrequires perl-libwww-perl
perl-libwww-perl-0:5.833-5.el6.noarch
perl-XML-Parser-0:2.36-7.el6.x86_64
perl-libwww-perl-0:5.833-5.el6.noarch
缺点:
yum-utils
您的系统上可能还没有yum
(yum-utils
需要)可能尚未在您的系统上- 不重复输出(通过附加即可轻松修复
| sort -u
) - 不过滤输入包名称(也很容易解决)
因此,尽管解决方案 1 很混乱,但总体而言它看起来更可靠且更易于使用。
答案3
解决方案#3:rpmdep --depending
显示依赖于给定参数的软件包,而不是显示软件包依赖性 (rpm -qR):然后 rpmdep 充当改进的rpm -q --whatrequires
命令。 [摘自 rpmdep 手册页]
我还想指出,解决方案 #2 需要安装很多软件包。在 openSUSE Leap 15.4 上,zypper 解决了总共 23 个软件包 (3.7 MB) 的依赖关系,需要安装这些软件包,只是为了启用 repoquery 命令。
rpmdep 是 rpmorphan 软件包中的实用程序之一。它类似于rpm -q --provides
/ --requires
,主要区别在于它适用于包,而不是功能。这正是OP所要求的。
例子:
$ rpmdep --depending firewalld
no depending : firewalld is an orphan
$ rpmdep --depending iptables
iptables is needed by firewalld