やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

update-alternativesの使い方(vimをeditorグループに登録する)

 アプリを別名定義して管理する。同名でほかに候補があれば優先度に応じて自動選択したり候補から選択できる。

目次

  1. ヘルプ
  2. 名前の一覧を取得する
  3. 名前に紐づくアプリ一覧

1. ヘルプ

$ update-alternatives --help
使い方: update-alternatives [<オプション> ...] <コマンド>

コマンド:
  --install <リンク> <名前> <パス> <優先度>
    [--slave <リンク> <名前> <パス>] ...
                           システムに alternatives のグループを追加する
  --remove <名前> <パス>   <名前> のグループ alternative から <パス> を削除する
  --remove-all <名前>      alternatives システムから <名前> のグループを削除する
  --auto <名前>            マスターリンク <名前> を、自動モードに切り替える
  --display <名前>         <名前> グループについての情報を表示する
  --query <名前>           --display <名前> の機械解析向けバージョン
  --list <名前>            <名前> グループのすべてのターゲットを表示する
  --get-selections         マスター alternative 名およびその状態を一覧する
  --set-selections         標準入力から alternative 状態を読み込む
  --config <名前>          <名前> グループの alternatives を表示し、ユーザに
                           使用したいものを尋ねる
  --set <名前> <パス>      <名前> の alternative として <パス> を設定する
  --all                    すべての alternatives に対して --config を呼び出す

<リンク> は /etc/alternatives/<名前> を指すシンボリックリンクです。
  (例: /usr/bin/pager)
<名前> はこのリンクグループのマスター名です。
  (例: pager)
<パス> は alternative ターゲットファイルのうちの 1 つの場所です。
  (例: /usr/bin/less)
<優先度> は整数です; より大きな数を持つ選択肢は、自動モードにおいてより高い
優先度を持ちます。

オプション:
  --altdir <ディレクトリ>    alternatives ディレクトリを変更する
  --admindir <ディレクトリ>  管理ディレクトリを変更する
  --log <ファイル>           ログファイルを変更する
  --force                    alternative リンク付きのファイルの置換を許容する
  --skip-auto                自動モードにおいて、正しく設定された alternatives
                             のプロンプトをスキップする (--config にのみ関連)
  --verbose                  冗長操作として、多く出力する
  --quiet                    静かな操作として、最小限の出力にする
  --help                     このヘルプを表示する
  --version                  バージョン番号を表示する

2. 名前の一覧を取得する

$ update-alternatives --get-selections

 名前だけを抽出する。

$ update-alternatives --get-selections | cut -f1 -d ' '

 editorという名前がつくものを抽出する。

$ update-alternatives --get-selections | grep 'editor'

3. 名前に紐づくアプリ一覧

$ update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.tiny
$ update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 3 個の選択肢があります。

  選択肢    パス             優先度  状態
------------------------------------------------------------
* 0            /bin/nano           40        自動モード
  1            /bin/ed            -100       手動モード
  2            /bin/nano           40        手動モード
  3            /usr/bin/vim.tiny   15        手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 
$ update-alternatives --display editor
$ update-alternatives --display editor
editor - 自動モード
  最適なリンクのバージョンは '/bin/nano' です
  リンクは現在 /bin/nano を指しています
  リンク editor は /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
  スレーブ editor.1.gz: /usr/share/man/man1/ed.1.gz
/bin/nano - 優先度 40
  スレーブ editor.1.gz: /usr/share/man/man1/nano.1.gz
/usr/bin/vim.tiny - 優先度 15
  スレーブ 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

 リンクを追ってみる。

$ which editor
/usr/bin/editor
$ ls -l $(which editor)
lrwxrwxrwx 1 root root 24 1113 22:04 /usr/bin/editor -> /etc/alternatives/editor
$ ls -l /etc/alternatives/editor
lrwxrwxrwx 1 root root 9 1113 22:04 /etc/alternatives/editor -> /bin/nano

 alternativesの定義は以下ディレクトリにある。

$ ls -1 /var/lib/dpkg/alternatives
$ cat /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/vim.tiny
15
/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

アプリを登録する

--install

  --install <リンク> <名前> <パス> <優先度>

<リンク> は /etc/alternatives/<名前> を指すシンボリックリンクです。
  (例: /usr/bin/pager)
<名前> はこのリンクグループのマスター名です。
  (例: pager)
<パス> は alternative ターゲットファイルのうちの 1 つの場所です。
  (例: /usr/bin/less)
<優先度> は整数です; より大きな数を持つ選択肢は、自動モードにおいてより高い
優先度を持ちます。

 最初に<パス>の実体のみ必要。これは実行ファイルである。その他、<リンク><名前>は新規作成してくれる。

名前の確認

 vimの名前を登録したい。既存かどうか調べるとvimは存在しない。

$ update-alternatives --get-selections | grep 'vim'
ex                             auto     /usr/bin/vim.tiny
rview                          auto     /usr/bin/vim.tiny
vi                             auto     /usr/bin/vim.tiny
view                           auto     /usr/bin/vim.tiny

登録する

$ sudo update-alternatives --install /usr/local/bin/vim vim /usr/local/bin/vim8.1.1017 50
update-alternatives: /usr/local/bin/vim (vim) を提供するために自動モードで /usr/local/bin/vim8.1.1017 を使います

 以下のような意味になる。

  1. /usr/local/bin/vim8.1.1017 のリンクを作る
  2. /usr/local/bin/vimというリンクにする
  3. --config <名前>で使う名前(グループ名)はvimにする
  4. vimグループにおける/usr/local/bin/vim8.1.1017の優先度は50である
引数
<リンク> (リンクファイル) /etc/alternatives/vim
<名前> (グループ名) vim
<パス> (実行バイナリファイル) editor /usr/local/bin/vim8.1.1017
<優先度> 50

登録されたか確認する

 リンクが作成されたか確認する。

$ ls -l /etc/alternatives/vim
lrwxrwxrwx 1 root root 26  327 16:01 /etc/alternatives/vim -> /usr/local/bin/vim8.1.1017
$ update-alternatives --list vim
/usr/local/bin/vim8.1.1017
$ update-alternatives --display vim
vim - 自動モード
  最適なリンクのバージョンは '/usr/local/bin/vim8.1.1017' です
  リンクは現在 /usr/local/bin/vim8.1.1017 を指しています
  リンク vim は /etc/alternatives/vim です
/usr/local/bin/vim8.1.1017 - 優先度 50
$ update-alternatives --config vim
リンクグループ vim に 1 つの alternative のみがあります (/usr/local/bin/vim が提供): /usr/local/bin/vim8.1.1017
設定は行いません。

 選択肢がないときは--configで選ばせる必要がないためか上記のようなメッセージが出た。

$ vim --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Mar 18 2019 13:12:10)
適用済パッチ: 1-1017
...

 万事OK。

さらに抽象化する

 先述はバージョンを抽象化した。次は用途で抽象化する。すなわちグループ名editorvimを候補として登録する。

editorの既存アプリ一覧

 まずは既存のeditorグループに登録されているアプリ一覧を確認する。

$ update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.tiny

 既存アプリの優先度も合わせて確認する。

$ update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 3 個の選択肢があります。

  選択肢    パス             優先度  状態
------------------------------------------------------------
* 0            /bin/nano           40        自動モード
  1            /bin/ed            -100       手動モード
  2            /bin/nano           40        手動モード
  3            /usr/bin/vim.tiny   15        手動モード

 vimがない。ここにvimを追加していく。最優先にしたいので50にしよう。41でも可。

editorグループにvimを登録する

 update-alternativesが管理するeditorリンクは以下にある。

$ ls -l /etc/alternatives/editor
lrwxrwxrwx 1 root root 9 1113 22:04 /etc/alternatives/editor -> /bin/nano

 グループeditorvimを登録する。/etc配下なのでsudoが必要。

$ sudo update-alternatives --install /usr/bin/editor editor /usr/local/bin/vim 50
update-alternatives: /usr/bin/editor (editor) を提供するために自動モードで /usr/local/bin/vim を使います

登録確認

 editorグループの一覧にvimがある。

$ update-alternatives --list editor
/bin/ed
/bin/nano
/usr/bin/vim.tiny
/usr/local/bin/vim

 候補の選択としてvimが出る。優先度50

$ update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 4 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /usr/local/bin/vim   50        自動モード
  1            /bin/ed             -100       手動モード
  2            /bin/nano            40        手動モード
  3            /usr/bin/vim.tiny    15        手動モード
  4            /usr/local/bin/vim   50        手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 

 vimが追加されている。OK!

実行確認

$ editor

 vimが実行された。OK!

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 9.0 2018-11-13
  • bash 4.4.12
  • python 2.7.13, pip 9.0.1
  • python3 3.5.3, pip3 9.0.1
  • ranger 1.9.2
$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux