
要求されたパッケージに依存するパッケージのリストを取得したいと思います。たとえば、すべての依存関係を取得したいと思います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パッケージが同じ名前の関数を1つだけ提供する場合は、パッケージ名をパラメータ--whatrequires
として渡すことは問題ありませんが、そうでない場合(perl-libwww-perl
上記の例のように)別の解決策が必要です。
ソリューション#1:rpm --test -e
コマンドが成功し(実際にシステムを変更せずに!)、依存関係がない場合は; given --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はrepoqueryコマンドを有効にするためにインストールする必要がある合計23パッケージ(3.7MB)への依存関係を解決します。
rpmdepはrpmorphanパッケージのユーティリティの1つです。rpm -q --provides
/ と似ていますが--requires
、主な違いは関数ではなくパッケージに適用されることです。これがOPが要求したものです。
例:
$ rpmdep --depending firewalld
no depending : firewalld is an orphan
$ rpmdep --depending iptables
iptables is needed by firewalld