update-alternatives簡(jiǎn)介
容我引用 update-alternatives學(xué)習(xí)筆記
Linux 發(fā)展到今天,可用的軟件已經(jīng)非常多了。這樣自然會(huì)有一些軟件的功能大致上相同。例如,同樣是編輯器,就有 nvi、vim、emacs、nano,而且我說(shuō)的這些還只是一部分。大多數(shù)情況下,這樣的功能相似的軟件都是同時(shí)安裝在系統(tǒng)里的,可以用它們的名稱來(lái)執(zhí)行。例如,要執(zhí)行 vim,只要在終端下輸入 vim 并按回車就可以了。不過(guò),有些情況下我們需要用一個(gè)相對(duì)固定的命令調(diào)用這些程序中的一個(gè)。例如,當(dāng)我們寫(xiě)一個(gè)腳本程序時(shí),只要寫(xiě)下 editor,而不希望要為“編輯器是哪個(gè)”而操心。Debian 提供了一種機(jī)制來(lái)解決這個(gè)問(wèn)題,而 update-alternatives 就是用來(lái)實(shí)現(xiàn)這種機(jī)制的。
update-alternatives學(xué)習(xí)筆記 - - CSDN博客
update-alternatives --help
命令輸出,從該輸出中可以獲得很多有用信息:
用法:update-alternatives [<選項(xiàng)> ...] <命令>
命令:
--install <鏈接> <名稱> <路徑> <優(yōu)先級(jí)>
[--slave <鏈接> <名稱> <路徑>] ...
在系統(tǒng)中加入一組候選項(xiàng)。
--remove <名稱> <路徑> 從 <名稱> 替換組中去除 <路徑> 項(xiàng)。
--remove-all <名稱> 從替換系統(tǒng)中刪除 <名稱> 替換組。
--auto <名稱> 將 <名稱> 的主鏈接切換到自動(dòng)模式。
--display <名稱> 顯示關(guān)于 <名稱> 替換組的信息。
--query <名稱> 機(jī)器可讀版的 --display <名稱>.
--list <名稱> 列出 <名稱> 替換組中所有的可用候選項(xiàng)。
--get-selections 列出主要候選項(xiàng)名稱以及它們的狀態(tài)。
--set-selections 從標(biāo)準(zhǔn)輸入中讀入候選項(xiàng)的狀態(tài)。
--config <名稱> 列出 <名稱> 替換組中的可選項(xiàng),并就使用其中
哪一個(gè),征詢用戶的意見(jiàn)。
--set <名稱> <路徑> 將 <路徑> 設(shè)置為 <名稱> 的候選項(xiàng)。
--all 對(duì)所有可選項(xiàng)一一調(diào)用 --config 命令。
<鏈接> 是指向 /etc/alternatives/<名稱> 的符號(hào)鏈接。 (如 /usr/bin/pager)
<名稱> 是該鏈接替換組的主控名。(如 pager)
<路徑> 是候選項(xiàng)目標(biāo)文件的位置。(程序的實(shí)際路徑)(如 /usr/bin/less)
<優(yōu)先級(jí)> 是一個(gè)整數(shù),在自動(dòng)模式下,這個(gè)數(shù)字越高的選項(xiàng),其優(yōu)先級(jí)也就越高。
選項(xiàng):
--altdir <目錄> 改變候選項(xiàng)目錄。
--admindir <目錄> 設(shè)置 statoverride 文件的目錄。
--log <文件> 改變?nèi)罩疚募? --force 就算沒(méi)有通過(guò)自檢,也強(qiáng)制執(zhí)行操作。
--skip-auto 在自動(dòng)模式中跳過(guò)設(shè)置正確候選項(xiàng)的提示
(只與 --config 有關(guān))
--verbose 啟用詳細(xì)輸出。
--quiet 安靜模式,輸出盡可能少的信息。不顯示輸出信息。
--help 顯示本幫助信息。
--version 顯示版本信息。
以editor為例來(lái)講解
editor編輯器。一般系統(tǒng)中都會(huì)安裝有多個(gè)具有編輯功能的程序, 比如ed、vi、vim、emacs24 ...
我們這里把 editor
稱作為一個(gè) 名稱
或者說(shuō) name
。
查看editor當(dāng)前包含的候選項(xiàng):
[fan 10:48:25]~$ update-alternatives --display editor
editor - 自動(dòng)模式
link best version is /usr/bin/vim.basic
鏈接目前指向 /usr/bin/vim.basic
link editor is /usr/bin/editor
slave editor.1.gz is /usr/share/man/man1/editor.1.gz
slave editor.fr.1.gz is /usr/share/man/fr/man1/editor.1.gz
slave editor.it.1.gz is /usr/share/man/it/man1/editor.1.gz
slave editor.ja.1.gz is /usr/share/man/ja/man1/editor.1.gz
slave editor.pl.1.gz is /usr/share/man/pl/man1/editor.1.gz
slave editor.ru.1.gz is /usr/share/man/ru/man1/editor.1.gz
/bin/ed - 優(yōu)先級(jí) -100
次要 editor.1.gz:/usr/share/man/man1/ed.1.gz
/bin/nano - 優(yōu)先級(jí) 40
次要 editor.1.gz:/usr/share/man/man1/nano.1.gz
/usr/bin/code - 優(yōu)先級(jí) 0
/usr/bin/emacs24 - 優(yōu)先級(jí) 0
次要 editor.1.gz:/usr/share/man/man1/emacs.emacs24.1.gz
/usr/bin/vim.basic - 優(yōu)先級(jí) 60
次要 editor.1.gz:/usr/share/man/man1/vim.1.gz
次要 editor.fr.1.gz:/usr/share/man/fr/man1/vim.1.gz
次要 editor.it.1.gz:/usr/share/man/it/man1/vim.1.gz
次要 editor.ja.1.gz:/usr/share/man/ja/man1/vim.1.gz
次要 editor.pl.1.gz:/usr/share/man/pl/man1/vim.1.gz
次要 editor.ru.1.gz:/usr/share/man/ru/man1/vim.1.gz
/usr/bin/vim.nox - 優(yōu)先級(jí) 40
次要 editor.1.gz:/usr/share/man/man1/vim.1.gz
次要 editor.fr.1.gz:/usr/share/man/fr/man1/vim.1.gz
次要 editor.it.1.gz:/usr/share/man/it/man1/vim.1.gz
次要 editor.ja.1.gz:/usr/share/man/ja/man1/vim.1.gz
次要 editor.pl.1.gz:/usr/share/man/pl/man1/vim.1.gz
次要 editor.ru.1.gz:/usr/share/man/ru/man1/vim.1.gz
/usr/bin/vim.tiny - 優(yōu)先級(jí) 10
次要 editor.1.gz:/usr/share/man/man1/vim.1.gz
次要 editor.fr.1.gz:/usr/share/man/fr/man1/vim.1.gz
次要 editor.it.1.gz:/usr/share/man/it/man1/vim.1.gz
次要 editor.ja.1.gz:/usr/share/man/ja/man1/vim.1.gz
次要 editor.pl.1.gz:/usr/share/man/pl/man1/vim.1.gz
次要 editor.ru.1.gz:/usr/share/man/ru/man1/vim.1.gz
[fan 10:48:43]~$
涉及到的路徑:
/usr/bin/名稱
/etc/alternatives/名稱
- 程序?qū)嶋H可執(zhí)行文件的路徑
查看這些路徑:
[fan 10:48:43]~$ ll /usr/bin/editor
lrwxrwxrwx 1 root root 24 7月 20 16:42 /usr/bin/editor -> /etc/alternatives/editor*
[fan 10:54:21]~$ ll /etc/alternatives/editor
lrwxrwxrwx 1 root root 18 7月 23 11:11 /etc/alternatives/editor -> /usr/bin/vim.basic*
[fan 10:54:31]~$ ll /usr/bin/vim.basic
-rwxr-xr-x 1 root root 2.4M 11月 25 2016 /usr/bin/vim.basic*
/var/lib/dpkg/alternatives
目錄為管理目錄,包含的相關(guān)文件就相當(dāng)于配置文件吧。一個(gè)名稱占用一個(gè)文件。
查看配置文件: less /var/lib/dpkg/alternatives/editor
auto
/usr/bin/editor
editor.1.gz
/usr/share/man/man1/editor.1.gz
editor.fr.1.gz
/usr/share/man/fr/man1/editor.1.gz
editor.it.1.gz
/usr/share/man/it/man1/editor.1.gz
editor.ja.1.gz
/usr/share/man/ja/man1/editor.1.gz
editor.pl.1.gz
/usr/share/man/pl/man1/editor.1.gz
editor.ru.1.gz
/usr/share/man/ru/man1/editor.1.gz
/bin/ed
-100
/usr/share/man/man1/ed.1.gz
/bin/nano
40
/usr/share/man/man1/nano.1.gz
/usr/bin/code
0
/usr/bin/emacs24
0
/usr/share/man/man1/emacs.emacs24.1.gz
/usr/bin/vim.basic
60
/usr/share/man/man1/vim.1.gz
/usr/share/man/fr/man1/vim.1.gz
/usr/share/man/it/man1/vim.1.gz
/usr/share/man/ja/man1/vim.1.gz
/usr/share/man/pl/man1/vim.1.gz
/usr/share/man/ru/man1/vim.1.gz
/usr/bin/vim.nox
40
/usr/share/man/man1/vim.1.gz
/usr/share/man/fr/man1/vim.1.gz
/usr/share/man/it/man1/vim.1.gz
/usr/share/man/ja/man1/vim.1.gz
/usr/share/man/pl/man1/vim.1.gz
/usr/share/man/ru/man1/vim.1.gz
/usr/bin/vim.tiny
10
/usr/share/man/man1/vim.1.gz
/usr/share/man/fr/man1/vim.1.gz
/usr/share/man/it/man1/vim.1.gz
/usr/share/man/ja/man1/vim.1.gz
/usr/share/man/pl/man1/vim.1.gz
/usr/share/man/ru/man1/vim.1.gz
更改editor的候選項(xiàng)
[fan 10:48:43]~$ update-alternatives --config editor
有 7 個(gè)候選項(xiàng)可用于替換 editor (提供 /usr/bin/editor)。
選擇 路徑 優(yōu)先級(jí) 狀態(tài)
------------------------------------------------------------
* 0 /usr/bin/vim.basic 60 自動(dòng)模式
1 /bin/ed -100 手動(dòng)模式
2 /bin/nano 40 手動(dòng)模式
3 /usr/bin/code 0 手動(dòng)模式
4 /usr/bin/emacs24 0 手動(dòng)模式
5 /usr/bin/vim.basic 60 手動(dòng)模式
6 /usr/bin/vim.nox 40 手動(dòng)模式
7 /usr/bin/vim.tiny 10 手動(dòng)模式
要維持當(dāng)前值[*]請(qǐng)按<回車鍵>,或者鍵入選擇的編號(hào):1
update-alternatives: 使用 /bin/ed 來(lái)在手動(dòng)模式中提供 /usr/bin/editor (editor)
update-alternatives: 錯(cuò)誤: 新建符號(hào)鏈接 /etc/alternatives/editor.dpkg-tmp 時(shí)出錯(cuò): 權(quán)限不夠 (需添加sudo)
以上說(shuō)明,它會(huì)刪除原來(lái)的/etc/alternatives/editor軟鏈接,再創(chuàng)建一個(gè)新的/etc/alternatives/editor軟鏈接來(lái)指向ed程序的實(shí)際路徑。
[fan 11:06:36]~$ ll /usr/bin/editor
lrwxrwxrwx 1 root root 24 7月 20 16:42 /usr/bin/editor -> /etc/alternatives/editor*
[fan 11:03:49]~$ ll /etc/alternatives/editor*
lrwxrwxrwx 1 root root 7 7月 24 11:03 /etc/alternatives/editor -> /bin/ed*
lrwxrwxrwx 1 root root 27 7月 24 11:03 /etc/alternatives/editor.1.gz -> /usr/share/man/man1/ed.1.gz
/var/lib/dpkg/alternatives/editor 文件的改變:
僅將 auto 改為 manual
總結(jié)
以下為個(gè)人理解,如有錯(cuò)誤請(qǐng)指正,不勝感激。詳見(jiàn)
man update-alternatives
通用名稱(generic name)和名稱(name)的區(qū)別:
generic name (or alternative link):通用名稱指的是 /usr/bin/name
簡(jiǎn)單的理解update-alternatives的機(jī)制:
/usr/bin/名稱 (軟鏈接)
|
V
/etc/alternatives/名稱 (軟鏈接) [每次更改就使它指向另一個(gè)程序的實(shí)際地址,并在配置文件中說(shuō)明當(dāng)前是自動(dòng)還是手動(dòng)]
|
V
程序?qū)嶋H路徑
還存在一個(gè)配置文件:
/var/lib/dpkg/alternatives/名稱
配置文件中指出該通用名稱包含哪些可用的程序(候選程序),并指出了每個(gè)程序的優(yōu)先級(jí)和可用的附加文件路徑。
另還有個(gè) slave 的概念
slave: 從屬,次要
slave對(duì)應(yīng)有 slave link(次要鏈接)。
在上面的editor的配置文件中我們可以看到多個(gè)slave其中的一個(gè)就是 editor.1.gz
單從editor來(lái)看,sleve link指向的是相關(guān)的man手冊(cè)文檔。每當(dāng)候選項(xiàng)一更改,sleve link也會(huì)跟著更改。
更改editor的候選項(xiàng)之前(為vim.basic時(shí)):
[fan 11:38:50]~$ ll /etc/alternatives/editor*
lrwxrwxrwx 1 root root 18 7月 24 11:16 /etc/alternatives/editor -> /usr/bin/vim.basic*
lrwxrwxrwx 1 root root 28 7月 24 11:16 /etc/alternatives/editor.1.gz -> /usr/share/man/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 7月 24 11:16 /etc/alternatives/editor.fr.1.gz -> /usr/share/man/fr/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 7月 24 11:16 /etc/alternatives/editor.it.1.gz -> /usr/share/man/it/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 7月 24 11:16 /etc/alternatives/editor.ja.1.gz -> /usr/share/man/ja/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 7月 24 11:16 /etc/alternatives/editor.pl.1.gz -> /usr/share/man/pl/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 7月 24 11:16 /etc/alternatives/editor.ru.1.gz -> /usr/share/man/ru/man1/vim.1.gz
[fan 11:38:50]~$ man editor
# 查看到的是vim的man手冊(cè)
更改editor的候選項(xiàng)為ed之后:
[fan 11:03:49]~$ ll /etc/alternatives/editor*
lrwxrwxrwx 1 root root 7 7月 24 11:03 /etc/alternatives/editor -> /bin/ed*
lrwxrwxrwx 1 root root 27 7月 24 11:03 /etc/alternatives/editor.1.gz -> /usr/share/man/man1/ed.1.gz
[fan 11:38:50]~$ man editor
# 查看到的是ed的man手冊(cè)
安裝一個(gè)候選項(xiàng)
以 vim 為例
使用--install
# 鏈接 名稱 (實(shí)際)路徑 優(yōu)先級(jí)
sudo update-alternatives --install /usr/bin/vim vim /usr/bin/vim.nox 40
man update-alternatives查看手冊(cè): --install link name path priority [--slave link name path]...
使用apt-get安裝vim-nox程序時(shí)的部分輸出:
正在設(shè)置 vim-nox (2:7.4.1689-3ubuntu1.2) ...
update-alternatives: 使用 /usr/bin/vim.nox 來(lái)在自動(dòng)模式中提供 /usr/bin/vim (vim)
update-alternatives: 使用 /usr/bin/vim.nox 來(lái)在自動(dòng)模式中提供 /usr/bin/vimdiff (vimdiff)
update-alternatives: 使用 /usr/bin/vim.nox 來(lái)在自動(dòng)模式中提供 /usr/bin/rvim (rvim)
update-alternatives: 使用 /usr/bin/vim.nox 來(lái)在自動(dòng)模式中提供 /usr/bin/rview (rview)
update-alternatives: 使用 /usr/bin/vim.nox 來(lái)在自動(dòng)模式中提供 /usr/bin/vi (vi)
update-alternatives: 使用 /usr/bin/vim.nox 來(lái)在自動(dòng)模式中提供 /usr/bin/view (view)
update-alternatives: 使用 /usr/bin/vim.nox 來(lái)在自動(dòng)模式中提供 /usr/bin/ex (ex)
使用apt-get卸載 vim-nox的部分輸出:
正在卸載 vim-nox (2:7.4.1689-3ubuntu1.2) ...
update-alternatives: 使用 /usr/bin/vim.basic 來(lái)在自動(dòng)模式中提供 /usr/bin/vi (vi)
update-alternatives: 使用 /usr/bin/vim.basic 來(lái)在自動(dòng)模式中提供 /usr/bin/view (view)
update-alternatives: 使用 /usr/bin/vim.basic 來(lái)在自動(dòng)模式中提供 /usr/bin/ex (ex)
update-alternatives: 使用 /usr/bin/vim.basic 來(lái)在自動(dòng)模式中提供 /usr/bin/rvim (rvim)
update-alternatives: 使用 /usr/bin/vim.basic 來(lái)在自動(dòng)模式中提供 /usr/bin/rview (rview)
update-alternatives: 使用 /usr/bin/vim.basic 來(lái)在自動(dòng)模式中提供 /usr/bin/vimdiff (vimdiff)
update-alternatives: 使用 /usr/bin/vim.basic 來(lái)在自動(dòng)模式中提供 /usr/bin/vim (vim)
安裝和卸載時(shí)都會(huì)執(zhí)行update-alternatives命令。
Eclipse示例
有三個(gè)版本的Eclipse,并且分別創(chuàng)建了三個(gè)啟動(dòng)腳本:
版本一: $HOME/opt/Eclipse/luna/eclipse-luna
,腳本內(nèi)容:
#!/bin/bash
export UBUNTU_MENUPROXY=0
$HOME/opt/Eclipse/luna/eclipse
版本二: $HOME/opt/Eclipse/kepler/eclipse-kepler
,腳本內(nèi)容:
#!/bin/bash
export UBUNTU_MENUPROXY=0
$HOME/opt/Eclipse/kepler/eclipse
版本三: $HOME/opt/Eclipse/scala/eclipse-scala
,腳本內(nèi)容:
#!/bin/bash
export UBUNTU_MENUPROXY=0
$HOME/opt/Eclipse/scala/eclipse
這里使用腳本而不是直接使用$HOME/opt/Eclipse/***/eclipse
,是為了添加啟動(dòng)參數(shù)。
現(xiàn)在可以通過(guò)在命令行中調(diào)用以下命令來(lái)配置Eclipse的各種版本:
sudo update-alternatives --install /usr/bin/eclipse eclipse $HOME/opt/Eclipse/scala/eclipse-scala 400
sudo update-alternatives --install /usr/bin/eclipse eclipse $HOME/opt/Eclipse/luna/eclipse-luna 300
sudo update-alternatives --install /usr/bin/eclipse eclipse $HOME/opt/Eclipse/kepler/eclipse-kepler 200
eclipse-scala 優(yōu)先級(jí)為 400 是最高值,所以他就是默認(rèn)程序。
你可以刪除任何 alternative:
sudo update-alternatives --remove eclipse $HOME/opt/Eclipse/scala/eclipse-scala
The command update-alternatives --query eclipse
should now print something like this:
Name: eclipse
Link: /usr/bin/eclipse # 1個(gè) 符號(hào)鏈接
Status: auto
Best: /home/williamdemeo/opt/Eclipse/scala/eclipse-scala
Value: /home/williamdemeo/opt/Eclipse/scala/eclipse-scala
Alternative: /home/williamdemeo/opt/Eclipse/kepler/eclipse-kepler # 可選的程序所在的路徑
Priority: 200
Alternative: /home/williamdemeo/opt/Eclipse/luna/eclipse-luna # 可選的程序所在的路徑
Priority: 300
Alternative: /home/williamdemeo/opt/Eclipse/scala/eclipse-scala # 可選的程序所在的路徑
Priority: 400
可通過(guò)如下命令來(lái)手動(dòng)選擇候選項(xiàng):update-alternatives --config eclipse
,命令輸出:
There are 3 choices for the alternative eclipse (providing /usr/bin/eclipse).
Selection Path Priority Status
------------------------------------------------------------
* 0 /home/williamdemeo/opt/Eclipse/scala/eclipse-scala 400 auto mode
1 /home/williamdemeo/opt/Eclipse/kepler/eclipse-kepler 200 manual mode
2 /home/williamdemeo/opt/Eclipse/luna/eclipse-luna 300 manual mode
3 /home/williamdemeo/opt/Eclipse/scala/eclipse-scala 400 manual mode
前面加*
號(hào)的表示當(dāng)前選擇的程序。然后可根據(jù)命令提示進(jìn)行更改。
在使用
--config
選項(xiàng)之前,可以先使用--display
替換該參數(shù),先進(jìn)行查看。
如果你想為它們創(chuàng)建應(yīng)用啟動(dòng)器(application launcher)可使用如下方法(也可以通過(guò)創(chuàng)建相關(guān)文檔創(chuàng)建):
mkdir -p ~/.local/share/applications
gnome-desktop-item-edit --create-new ~/.local/share/applications/
Java示例
java就比較麻煩了點(diǎn),因?yàn)閖ava相關(guān)的命令比較多,要改的地方多。
還好有個(gè)update-java-alternatives
命令。
可以查看另一篇文章:Ubuntu安裝java和使用update-java-alternatives進(jìn)行切換
圖形工具 Gnome alternatives
Gnome Alternatives
sudo apt-get install galternatives
不推薦。
更改優(yōu)先級(jí)
使用root權(quán)限編輯/var/lib/dpkg/alternatives
下的相關(guān)文件,更改優(yōu)先級(jí)后保存。
然后運(yùn)行如下命令sudo update-alternatives --auto 名稱
,將“名稱”替換成相應(yīng)值。
比如:
- 修改某網(wǎng)頁(yè)瀏覽器的優(yōu)先級(jí),編輯文件
/var/lib/dpkg/alternatives/x-www-browser
然后運(yùn)行如下命令sudo update-alternatives --auto x-www-browser
使其生效。 - 修改編輯器的優(yōu)先級(jí),編輯文件
/var/lib/dpkg/alternatives/editor
然后運(yùn)行如下命令sudo update-alternatives --auto editor
使其生效。
--auto
選項(xiàng),根據(jù)優(yōu)先級(jí)設(shè)置回默認(rèn)值(優(yōu)先級(jí)最高的候選項(xiàng))。命令輸出(在確實(shí)更改了editor后):
[fan 11:06:00]~$ update-alternatives --auto editor update-alternatives: 使用 /usr/bin/vim.basic 來(lái)在自動(dòng)模式中提供 /usr/bin/editor (editor) update-alternatives: 錯(cuò)誤: 新建符號(hào)鏈接 /etc/alternatives/editor.dpkg-tmp 時(shí)出錯(cuò): 權(quán)限不夠 [fan 11:07:39]~$ sudo update-alternatives --auto editor [sudo] fan 的密碼: update-alternatives: 使用 /usr/bin/vim.basic 來(lái)在自動(dòng)模式中提供 /usr/bin/editor (editor)
參考
update-alternatives學(xué)習(xí)筆記
update-alternatives - William DeMeo
個(gè)人博客: Fan's Blog