動かざることバグの如し

近づきたいよ 君の理想に

Ubuntuのupdate-alternativesでコマンド切り替えする

環境

やりたいこと

サーバー運用していると1つのコマンドで、複数のバージョンを1つのサーバーにインストールしたくなる。

が、切り替えをエイリアスでやると管理がわからなくなって破滅に向かう。そこでUbuntu標準にあるupdate-alternativesコマンドを使ってみたのメモ

やり方

例としてPythonのバージョンが複数インストールされているとする

$ which python3.8
/usr/bin/python3.8
$ which python3.10
/usr/bin/python3.10

デフォルトだとPython3.8がインストールされているのでそっちが使われている状態 今回はPython3.10をデフォルトにするのがゴール

$ python3 -V
Python 3.8.10

update-alternativesコマンドを実行

# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
update-alternatives: /usr/bin/python3 (python3) を提供するために自動モードで /usr/bin/python3.10 を使います

引数の意味は update-alternatives --install [作成するシンボリックのパス] [グループ名] [実体へのパス] [優先度]

これで3.10がデフォルトになる 優先度は高ければ高いほど優先される

$ python3.10 -V
Python 3.10.4

設定確認

# update-alternatives --display python3
python3 - 自動モード
最適なリンクのバージョンは '/usr/bin/python3.10' です
リンクは現在 /usr/bin/python3.10 を指しています
リンク python3 は /usr/bin/python3 です

このままだとメインのPython3.8への切り替えができなくなってしまうのでそっちも設定する

# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2

優先度が1より高い2を指定したのでPythonは3.8が使われるようになる

$ python3 -V
Python 3.8.10

インタラクティブにコマンド切り替えする場合は --config を使う

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

  選択肢    パス               優先度  状態
------------------------------------------------------------
* 0            /usr/bin/python3.8    2         自動モード
  1            /usr/bin/python3.10   1         手動モード
  2            /usr/bin/python3.8    2         手動モード

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

これで Python3.10が使えるようになる

おまけ

結局UbuntuでPython3のバージョンを書き換えるのは良くなかったっぽくて、aptコマンドが使えなくなってしまった

のでPythonコマンドにエイリアス張った

sudo update-alternatives --install /usr/bin/python my-python /usr/bin/python3.10 1

おわり

参考リンク