環境
- Ubuntu 20.04
やりたいこと
サーバー運用していると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コマンドが使えなくなってしまった
sudo update-alternatives --install /usr/bin/python my-python /usr/bin/python3.10 1
おわり