Debianディストリビューションには Debian Alternatives System があります。 Wikiから:
Debian代替システムは、同じまたは類似の機能を実行する複数のプログラムを、同時にインストールされるが、デフォルトとして指定された1つの特定の実装を持つ代替実装としてリストする方法を作成します。たとえば、多くのシステムには、同時に複数のテキストエディタがインストールされています。 viプログラムは、nvi、elvis、vimなどの多くの実装を持つエディターの典型的な例ですが、デフォルトとして指定する必要があるのはどれですか?
一般に、Debianには特定の代替手段を提供する複数のパッケージがあります。 Debianリポジトリに存在するそのようなすべてのパッケージの完全なリストを取得するにはどうすればよいですか?例としてviの代替を使用しましょう。
注:インストールされているパッケージのリストに対してこのようなクエリを実行するのは簡単ですが、それはこの質問が尋ねるものではありません。
これは少し遅れていることは知っていますが、この投稿は現在、Debianでの代替案の検索に関連する検索ヒットのトップの1つです。
ここでupdate-alternatives
を使用する際の問題は、私が知る限り、インストールされているオプションしか表示されないことです(そのマニュアルページはかなりまばらです)。
タイトルで提示された質問に答える、つまり、代替手段(インストールされているかどうかに関係なく)を提供するすべての利用可能なパッケージを見つけるには、次を使用できます。
aptitude search '?provides(pattern)'
これは次のように省略できます。
aptitude search '~Ppattern'
ここで、pattern
は、探している選択肢のすべてまたは一部です。 vi
の特定のケースでは、これは実際には機能しません。パッケージnvi
およびvim
をaptitude show
またはapt-cache show
で調べると、どちらも「提供:」セクションに「vi」がリストされていないことがわかります。実際、nviの説明にはそのセクションが完全に欠落しています。
ただし、editor
などの他の代替手段では十分に機能します。
$ aptitude search '~Peditor'
p deutex - composition tool for Doom-style WAD files
p edbrowse - /bin/ed-alike webbrowser written in C
p emacs24 - GNU Emacs editor (with GTK+ GUI support)
p emacs24-lucid - GNU Emacs editor (with Lucid GUI support)
p emacs24-nox - GNU Emacs editor (without GUI support)
p fte-console - Text editor for programmers - console edi
p fte-terminal - Text editor for programmers - version for
p fte-xwindow - Text editor for programmers - X Window Sy
p jed - editor for programmers (textmode version)
p jove - Jonathan's Own Version of Emacs - a compa
p jupp - user friendly full screen text editor
p le - Text editor with block and binary operati
p ledit - line editor for interactive programs
p levee - very small vi clone
p mg - microscopic GNU Emacs-style editor
p nano - small, friendly text editor inspired by P
p nano-tiny - small, friendly text editor inspired by P
p ne - easy-to-use and powerful text editor
p pluma - official text editor of the MATE desktop
p rlfe - Front-end using readline to "cook" input
p rlwrap - readline feature command line wrapper
p scite - Lightweight GTK-based Programming Editor
p vigor - nvi with the evil Paperclip
p vile - VI Like Emacs - vi work-alike
p vim - Vi IMproved - enhanced vi editor
p vim-athena - Vi IMproved - enhanced vi editor - with A
p vim-gnome - Vi IMproved - enhanced vi editor - with G
i vim-gtk - Vi IMproved - enhanced vi editor - with G
p vim-nox - Vi IMproved - enhanced vi editor - with s
i vim-tiny - Vi IMproved - enhanced vi editor - compac
p xjed - editor for programmers (x11 version)
p xul-ext-password-editor - edit password manager entries in Mozilla
p xvile - VI Like Emacs - vi work-alike (X11)
これは完璧ではありませんが、aptitude
には 非常に柔軟な検索機能 があり、パッケージが提供する選択肢を正しくリストしないという問題を回避できます。たとえば、"~seditors ~dvi\s"
を次のように使用します。検索パターンでは、説明に文字列「vi」が含まれる「editors」セクションのすべてのパッケージが一覧表示されます。
もう1つのオプションは、 DebianのパッケージWebサイト を使用することです。ここで、同様のパッケージが右側のセクションにリストされています。
これは状況によって異なります。 x-www-browserのように、パッケージを使用せず、メンテナスクリプトを介してupdate-alternativesに追加される代替手段がいくつかあります。
/var/lib/dpkg/info/iceweasel.postinst: update-alternatives --install /usr/bin/x-www-browser \
/var/lib/dpkg/info/iceweasel.postinst: update-alternatives --remove mozilla /usr/bin/iceweasel
/var/lib/dpkg/info/iceweasel.postinst: update-alternatives --install /usr/bin/gnome-www-browser \
/var/lib/dpkg/info/iceweasel.prerm: update-alternatives --remove x-www-browser /usr/bin/iceweasel
/var/lib/dpkg/info/iceweasel.prerm: update-alternatives --remove gnome-www-browser /usr/bin/iceweasel
/var/lib/dpkg/info/chromium.postinst: update-alternatives --install /usr/bin/x-www-browser \
/var/lib/dpkg/info/chromium.postinst: update-alternatives --install /usr/bin/gnome-www-browser \
/var/lib/dpkg/info/chromium.prerm: update-alternatives --remove x-www-browser /usr/bin/chromium
/var/lib/dpkg/info/chromium.prerm: update-alternatives --remove gnome-www-browser /usr/bin/chromium
単一のメタパッケージを使用して同じバイナリの任意のバージョンをインストールするものもあります(Java/OpenJREパッケージが思い浮かびます。init
もあります)。 "Provides" (これは通常、代替DPKGデータベースへの更新が付属しています)を埋めることによって仮想パッケージを使用するものもあります。その場合、これらのパッケージはいずれも同じバイナリを提供する必要があります。
では、特定のファイルを提供するすべてのパッケージを見つける方法は?あなたがそうするパッケージを知っているなら、私はProvidesを使います、そしてapt-file search file
他のすべてのために。
仮想パッケージ と Debian代替システム (バイナリが機能する場所)は関連していますが、同じではありません。仮想パッケージの場合、apt-cache
を使用して、どの(実際の)パッケージがそれを「提供」するかを見つけることができます。
$ apt-cache showpkg awk
Package: awk
Versions:
Reverse Depends:
base-files,awk
base-files,awk
Dependencies:
Provides:
Reverse Provides:
mawk:i386 1.3.3-17ubuntu2
gawk:i386 1:4.0.1+dfsg-2.1ubuntu2
original-awk 2012-12-20-1
mawk 1.3.3-17ubuntu2
gawk 1:4.0.1+dfsg-2.1ubuntu2
ディスプレイマネージャーの場合、仮想パッケージはx-display-manager
です。
$ apt-cache showpkg x-display-manager
Package: x-display-manager
Versions:
Reverse Depends:
utf8-migration-tool,x-display-manager
razorqt,x-display-manager
lxde,x-display-manager
numlockx,x-display-manager
ltsp-client-core,x-display-manager
Dependencies:
Provides:
Reverse Provides:
gdm 3.10.0.1-0ubuntu3.1
lightdm 1.10.6-0ubuntu1
kdm 4:4.11.11-0ubuntu0.2
xdm 1:1.1.11-1ubuntu1
wdm 1.28-16
slim 1.3.4-2.1
lxdm 0.4.1-0ubuntu6
kdm 4:4.11.8-0ubuntu6
gdm 3.10.0.1-0ubuntu3
lightdm 1.10.0-0ubuntu3
代替システムは、Braiamの回答が示すように、メンテナスクリプトでupdate-alternatives
を呼び出すことによって処理され、パッケージングシステムの残りの部分はこれらを幸いにも認識していません。 Provides
フィールドは、単にバイナリを介してではなく、提供されるサービスまたはライブラリの観点から別のパッケージを提供する可能性があるため、代替よりも一般的です。
パッケージメンテナがProvides
フィールドに代替案に関する情報を追加し(そしてvi
のような代替案のすべてのエンドポイントの仮想パッケージを作成し)、パッケージ自体を検査しなければ、現時点では一般的な方法はありません。どのパッケージが代替手段を提供するかまで。
質問に厳密に関連して、vi代替案を見つける:
update-alternatives --list editor
出力:
/bin/ed
/bin/nano
/usr/bin/mcedit
/usr/bin/vim.basic
/usr/bin/vim.tiny
または:
update-alternatives --config vi
出力:
There are 2 choices for the alternative vi (providing /usr/bin/vi).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/vim.basic 30 auto mode
1 /usr/bin/vim.basic 30 manual mode
2 /usr/bin/vim.tiny 10 manual mode
Press enter to keep the current choice[*], or type selection number:
Ubuntuでは、パッケージcommand-not-found
に多くの選択肢を含むデータベースが含まれています。インストール後、/usr/lib/command-not-found --no-failure-msg --ignore-installed mail
で照会できます(mail
の代替をリストするため)。
bashでコマンドが欠落していることを自動的に提案したくない場合は、〜/ .bashrcにunset -f command_not_found_handle
を書き込むか、/etc/bash.bashrc
で定義をグローバルに削除してください。 (zshについても同様に行います。)
Debianでは、このツールはapt-fileのみを使用してデータベースを作成するため、代替手段は不明です(テストされていません)。そこではapt-file search ...
と同じように伝えます。
Ubuntuソース: https://launchpad.net/command-not-found