update-alternatives でシンボリックリンク管理から逃げたい

create
2022年07月14日
update
2022年07月14日

🍩前置き

あるツールをインストールして PATH に通そうとしたとき、「そういや update-alternatives っていう仕組みあったな……」と思い出して調べ直したときの備忘録。

update-alternatives とは

Debian Alternatives システムを構成するシンボリックリンクを生成・削除・管理するツール。

Debian Alternatives システムについて

たとえば

  • vinano のように機能が被っている複数のアプリ

  • 異なる複数のバージョンをインストールしているアプリ

のようなアプリがある場合、そのうちのどれを優先的にデフォルトとして利用するかを決める必要がでてくる。
その方法としてはシンボリックリンクを利用するのが一般的。

ただし、そのシンボリックリンクの管理を全部人力でやろうとすると手間がかかるしミスしやすい。
そこでシステムがシンボリックリンクの作成や管理を行うことで上記の問題点を解消させるため、 Debian Alternatives システムが導入されている。

Debian Alternatives System ファイル構成図
Figure 1. Debian Alternatives System ファイル構成図
リンクグループ
関連の強いシンボリックリンクをひとまとめにグループ化したもの(たとえば editor)。
グループとして変更を行えると便利なことが多い、らしい。
だいたい /etc/alternatives 配下のシンボリックリンクのことを指す、はず。
直接リンクせず /etc/alternatives を経由する理由
FHS にしたがって管理者による変更を /etc ディレクトリだけに限定するのが目的らしい。

🦮使い方

Table 1. 使われる引数
Args Desc

<link>

ユーザー実行用のシンボリックリンクのパス。
環境変数 PATH に登録済みの場所を指定するのが一般的。
e.g. /usr/bin/editor

<name>

リンクグループ名かつ /etc/alternatives 下のシンボリックリンク名。
パスではないことに注意。
e.g. editor

<path>

実際に実行されるアプリ本体のパス。
e.g. /bin/nano

<priority>

優先度の数値。数値が大きいほど優先度も高い。
e.g. 50

作成・追加

update-alternatives --install <link> <name> <path> <priority>

リンクグループを新規作成してアプリを登録する。
もしくは既存のリンクグループにアプリを追加登録する。

vi コマンドで nano を起動するように設定、優先度は低くする
update-alternatives --install /usr/bin/vi vi /bin/nano 10

削除

update-alternatives --remove <name> <path>

リンクグループから登録しているアプリを削除する。

vi リンクグループから nano コマンドを削除
update-alternatives --remove vi /bin/nano
update-alternatives --remove-all <name>

リンクグループごとまとめて削除する。

vi リンクグループを削除
update-alternatives --remove-all vi

編集

update-alternatives --config <name>

指定したリンクグループにおいて、デフォルトで使うアプリを選択する選択画面を表示する。

editor リンクグループのデフォルト動作を手動選択
update-alternatives --config editor
There are 2 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
  1            /bin/nano            40        manual mode
  2            /usr/bin/vim.basic   30        manual mode

Press <enter> to keep the current choice[*], or type selection number:

情報表示

update-alternatives --get-selections

リンクグループのシンボリックリンク名(master alternative name)とそのステータスを一覧表示する。

登録しているリンクグループの一覧
update-alternatives --get-selections
arptables                      auto     /usr/sbin/arptables-nft
awk                            auto     /usr/bin/mawk
builtins.7.gz                  auto     /usr/share/man/man7/bash-builtins.7.gz
ebtables                       auto     /usr/sbin/ebtables-nft
editor                         auto     /bin/nano
...
update-alternatives --list <name>

指定したリンクグループに登録されているアプリを一覧表示する。

editor リンクグループの登録アプリ一覧
update-alternatives --list editor
/bin/nano
/usr/bin/vim.basic
update-alternatives --display <name>

指定したリンクグループについての情報を表示する。

editor リンクグループの情報表示
update-alternatives --display editor
editor - auto mode
  link best version is /bin/nano
  link currently points to /bin/nano
  link editor is /usr/bin/editor
  slave editor.1.gz is /usr/share/man/man1/editor.1.gz
  ...