Debian 发行版具有Debian 替代系统。来自维基:
Debian 替代系统创建了一种方法,将多个实现相同或相似功能的程序列为同时安装的替代实现,但将一个特定实现指定为默认值。例如,许多系统同时安装了多个文本编辑器。 vi 程序是一个经典的编辑器示例,它有许多实现,例如 nvi、elvis、vim 等,但是应该将哪一个指定为默认实现呢?
一般来说,Debian 中有多个软件包提供特定的替代方案。如何获得 Debian 存储库中存在的所有此类软件包的完整列表?让我们使用 vi 替代方案作为示例。
注意:对已安装软件包的列表进行这样的查询很容易,但这不是这个问题所问的。
答案1
虚拟包和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
)并且不检查包本身,那么目前没有通用的方法来确定哪个包可以提供替代方案。
答案2
我知道这有点晚了,但这篇文章目前是与在 Debian 中寻找替代方案相关的热门搜索点击之一。
在这里使用的问题update-alternatives
是,据我所知,它只会显示已安装的选项(它的手册页非常稀疏)。
回答标题中提出的问题,即发现全部可用提供替代方案的软件包(无论是否安装),您可以使用:
aptitude search '?provides(pattern)'
也可以缩写为:
aptitude search '~Ppattern'
pattern
您正在寻找的替代方案的全部或部分在哪里。在 的具体情况下vi
,这实际上不起作用。如果您使用或来检查软件包nvi
和,您将看到两者都没有在其“Provides:”部分中列出“vi”。事实上,nvi 的描述完全缺少该部分。vim
aptitude show
apt-cache show
然而,它对于其他替代方案来说效果相当好,例如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"
搜索模式将列出“editors”部分中其描述包含字符串“vi”的所有包。
另一种选择是使用Debian 的软件包网站,其中类似的包列在右侧部分中。
答案3
这取决于。有一些替代方案,例如 x-www-browser,不使用包,而是通过维护者脚本添加到更新替代方案中:
/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
)。其他人则使用虚拟包,通过填写「提供」(这通常伴随着替代 DPKG 数据库的更新)在这种情况下,任何这些包都应该提供相同的二进制文件。
那么,如何找到所有提供特定文件的包呢?如果您知道有一个包可以使用 Provides 以及apt-file search file
其他所有功能,我会使用 Provides 。
答案4
与问题严格相关,找到六选择:
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: