メモ: alternativesコマンドの動き

コマンド切り替えのためのコマンド・alternativesについての覚え書き。

alternativesに登録されたもののうち、最も高いpriority値を持つプログラムが、update-alternativesコマンドを使った際に自動で選択される

例として想定する作業

OpenJDKがインストール済みのFedoraマシンに、追加でインストールしたSunJDKを、普段使うJavaに設定する。よくある。

(準備)alternativesに登録済みのコマンドを確認する

OSに登録されている、起動可能な「java」コマンドを確認する。

$ sudo alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
*+ 2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number: 

左端の記号の意味は、次のとおり。

「+」
現在選択されているプログラムの行に表示される。
「*」
カーソルのようなもの。プログラムが複数登録されているとき、最もpriorityの高いものの行に表示される。

上の場合、現在選択されている(=単に「java」とタイプしたときに実行される)プログラムが、jre-1.6.0-openjdk.x86_64であることが分かる。

また、そのプログラムのpriorityの値が一番高いことも見て取れる。# 両者はかならずしも一致しない。priorityが低いプログラムを選択することもできる。

さらに、2つのjavaコマンドの具体的なpriority値を確認する。

$ sudo alternatives --display java
java - status is manual.
 link currently points to /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
/usr/lib/jvm/jre-1.5.0-gcj/bin/java - priority 1500
 slave keytool: /usr/lib/jvm/jre-1.5.0-gcj/bin/keytool
...
(略)
...
 slave unpack200.1.gz: (null)
/usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java - priority 16000
 slave keytool: /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/keytool
...
(略)
...
 slave unpack200.1.gz: /usr/share/man/man1/unpack200-java-1.6.0-openjdk.1.gz
Current `best' version is /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java.

jre-1.5.0-gcj(リストに出てくるが選択されていない方)は1500、jre-1.6.0-openjdk.x86_64は16000になっている。

手動設定と自動設定

手動設定(対話的設定)

登録済みの2つのプログラムよりもpriorityを下げて、SunJDKを登録してみる。ここでは、1400とする。

$ sudo alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_26/bin/java 1400

確認する。

$ sudo alternatives --config java

There are 3 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
*+ 2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
   3           /usr/java/jdk1.6.0_26/bin/java

Enter to keep the current selection[+], or type selection number: 

末尾の行に、選択可能なプログラムとしてSunJDK(jdk1.6.0_26)が追加された。が、priorityの値が一番高いのは、相変わらずjre-1.6.0-openjdk.x86_64だ。

この状態で、有効化するコマンドを対話的に選択できる。jdk1.6.0_26に変更したければ、「3」を入力すればよい。

自動設定

さて、せっかく事前に登録済みプログラムのpriorityを調べたので、SunJDKにそれらよりも大きな値を与えて登録してみる。

こうすることで、alternativesを自動設定モードにしたときに、SunJDKが自動選択されるようになる。

jre-1.6.0-openjdk.x86_64が16000だったので、ここではSunJDKを17000とする。

$ sudo alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_26/bin/java 17000

確認する。

$ sudo alternatives --config java

There are 3 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
 + 2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
*  3           /usr/java/jdk1.6.0_26/bin/java

Enter to keep the current selection[+], or type selection number: 

最もpriorityが高いコマンドとして、SunJDKにマークがついた。確認したら、対話的な設定に進まずに、終了する。

update-alternativesコマンドの--autoオプションを使うと、最もpriorityの高いコマンドが自動的に選択されるモードになるので、今回はそうしてみる。

$ sudo update-alternatives --auto java

確認する。

$ sudo alternatives --config java

There are 3 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
   2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
*+ 3           /usr/java/jdk1.6.0_26/bin/java

Enter to keep the current selection[+], or type selection number:

SunJDKが正しく選択された。

gdgd考えたこと

プログラムの選択を対話的に行うのであれば、priorityの値を登録済みプログラムの中で最高にしておくことは必須ではない。

がしかし、選択されるべきプログラムのpriority値を上げておくことは、update-alternatives --auto を予期せず実行したときの保険になる。だから、ムダではないかもしれない。…とか。