Linux中的update-alternatives(或alternatives)

alternatives与update-alternatives好像是同一样工具(各个linux发行版使用的不一样),这里就以update-alternatives为例进行讲述。update-alternatives是linux里很有用的工具,不仅在Debian系列,redhat系列也同样有它。

linux发展到今天,可用的软件已经非常多了。这样自然会有一些软件的功能大致上相同。例如,同样是编辑器,就有nvi,vim,emacs,nano等。大多数情况下,这样的功能相似的软件都是同时安装在系统里的,可以用它们的名称来执行。例如,要执行vim,只要在终端下输入vim并按回车就可以了。不过,有些情况下我们需要用一个相对固定的命令调用这些程序中的一个。例如,当我们写一个脚本程序时,只要写下editor,而不希望要为“编辑器是哪个”而操心。以Debian为例,它提供了一种机制来解决这个问题,而update-alternatives就是用来实现这种机制的。

在说明update-alternatives的详细内容之前,先让我们看看系统中已有的例子。打开终端,执行下面的命令:

技术分享

我们看到,editor这个可执行命令实际上是个符号连接,它指向/etc/alternatives/editor;而/etc/alternatives/editor也是个符号连接,它指向/bin/nano。这样,当我们输入editor并回车,将执行nano。之所以要在费心建立这样两个链接,就是要实现上面说到的特性:方便脚本程序的编写和系统的管理。

下面我们来看看update-alternatives的功能。首先要介绍的参数是 --display 。它使我们可以看到一个命令的所有可选命令。执行代码:

$ sudo update-alternatives -- display editor

技术分享

你可以看到我的机器上所有可以用来被 editor 链接的命令。

下面说说 --config 。这个选项使我们可以选择其中一个命令,代码如下:

$ sudo  update-alternatives --config editor

技术分享

上例中,我从3代表的emacs24编辑器,修改为1代表的ed。

说到这里,我们就要介绍一些概念了。首先,update-alternatives在一般情况下是由postinst和prerm这样的安装脚本自动调用的,所以一个alternative的状态有两种:自动和手动。每个alternative的初始状态都是自动,如果系统发现管理员手动修改了一个alternative,它的状态就从自动变成了手动,这样安装脚本就不会更新它了。如果你希望将一个alternative变回自动,只要执行代码:

$ sudo update-alternatives --auto editor

就可以了。我们来看一下官方的命令选项:

技术分享

你注意到了吗?上面见到了”名字“。该怎样写名字呢?这就是我们要介绍的第二个概念:

  • general name -- 这是指一系列功能相似的程序的“公用”名字(包括绝对路径),比如 /usr/bin/editor。

  • link -- 这是指一个alternative在 /etc/alternative中的名字,比如 editor。

  • alternative -- 顾名思议,这是指一个可选的程序所在的路径(包括绝对路径),比如 /usr/bin/vim。

--auto , --display和--config 跟的都是link。我们要说的第三个概念是优先级。这个比较简单,当然优先级越高的程序越好啦!最后一个概念是主和从的alternative。想想看,你将/usr/bin/editor链接到vim,可是当你执行man editor时看到的却是emacs的manpage,你会做何感想呢?这就引出了主和从alternative的概念:当更新主的alternative时,从的alternative也会被更新。

说完这四个重要的概念后,我们介绍另外两个选项,其它的自己看文档。

第一个是 --install。它的格式是:sudo update-alternatives --install gen link alt pri [--slave sgen slink salt]...

gen,link,alt,pri分别是我们上面说过的。如果需要从alternative,你可以用 --slave加在后面。如果你在向一个已经存在的alternative组中添加新的alternatives,该命令会把这些alternatives加入到这个已经存在的alternative组的列表中,并用新的可选命令作为新的命令;否则,将会将立一个新的自动的alternative组。

如果我们加入一个错误的alternative。我不想要这个alternative了。在这种情况下,可以执行下面的命令,代码示例:

update-alternatives --remove name path

name是一个在/etc/alternatives中的名字,也就是上面的link,而path是希望删除的可选程序名的绝对路径名(放心,这样只是从列表中删除了这个程序,并不会真的从硬盘上删除程序的可执行文件)。如果从一个alternative组中删除了一个正在被链接的程序并且这个组仍然没有变成空的,update-alternative会自动用一个具有其他优先级的可选程序代替原来的程序。如果这个组变成空的了,那么连这个alternative组都会被移除。如果删除的程序没有被链接,则只有有关这个程序的信息会移除。

注:update-alternatives工具非常适合安装java,特别是多版本的java。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。