Linux 環境で開発する場合、多くの場合、異なるバージョンの実行可能ファイルまたは動的ライブラリを使用する必要があります。
update-alternatives ツールを使用すると、バイナリ プログラムまたはダイナミック ライブラリの複数のバージョンを共存させ、必要に応じて切り替えることができます。
基本的
- バージョン番号が付いたバイナリ プログラム名 (例: gcc-7、gcc-8)。
- ソフト リンクを使用して、バージョン番号を含まない名前を作成します (例: /usr/bin/gcc)。
ソフト リンクを使用して実際のプログラムを指定します。例: /usr/bin/gcc -> /usr/bin/gcc-7 - デフォルトでは、バージョン番号を省略した名前でコマンドを使用します。次に例を示します。
$gcc -v
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
$gcc-7 -v
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
- update-alternatives コマンドは、異なる実際のプログラムまたは動的ライブラリを指すように接続を変更することで、複数バージョンの共存と動的切り替えの効果を実現できます。
コマンド形式
update-alternatives [option...] command
インストールコマンド
update-alternatives --install link name path priority
link バージョン番号を含まないリンク名 (例: /usr/bin/gcc)。
name update-alternatives データベース名。作成後にこの名前を使用してソフトウェアを管理できます。カスタム。
path 実際の実行可能プログラムのパス (例: /usr/bin/gcc-7)。
優先順位。update-alternatives には手動 (manual) と自動 (auto) の 2 つのモードがあり、前者はユーザーが指定したバージョンを使用し、自動モードでは優先度の高い (値が大きい) プログラムのバージョンが使用されます。
インストール コマンドの例:
gcc リンクと g++ リンクをそれぞれ作成し、gcc-8 を高優先度に設定します。
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 5
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 5
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 9
リストコマンド
インストールされているソフトウェアのバージョンを確認する
$ update-alternatives --list gcc
/usr/bin/gcc-7
/usr/bin/gcc-8
表示コマンド
リンク先の詳細情報をご覧ください
$ update-alternatives --display gcc
gcc - auto mode
link best version is /usr/bin/gcc-8
link currently points to /usr/bin/gcc-8
link gcc is /usr/bin/gcc
/usr/bin/gcc-7 - priority 5
/usr/bin/gcc-8 - priority 9
クエリコマンド
詳細はリンク先をご覧ください。
表示コマンドとの違いは、情報がフォーマットされていることです。
$ update-alternatives --query gcc
Name: gcc
Link: /usr/bin/gcc
Status: auto
Best: /usr/bin/gcc-8
Value: /usr/bin/gcc-8
Alternative: /usr/bin/gcc-7
Priority: 5
Alternative: /usr/bin/gcc-8
Priority: 9
すべてのコマンド
名前は少し奇妙ですが、アクションはそうではありません。ただし、ヘルプドキュメントの man ページ ( man コマンドの使用に関するリファレンス) は確かにコマンドとして説明されています。
この機能は、各リンクを 1 つずつ表示および設定することです。
update-alternatives --all
configコマンドスイッチのバージョン
現在 gcc->gcc-7 ですが、config コマンドを使用して gcc->gcc-8 にします。
config コマンドは、リンクが対応するプログラムのバージョンのリストを数値で選択して表示します。
$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gcc-8 9 auto mode
* 1 /usr/bin/gcc-7 5 manual mode
2 /usr/bin/gcc-8 9 manual mode
Press <enter> to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/bin/gcc-8 to provide /usr/bin/gcc (gcc) in manual mode
$ gcc -v
gcc version 8.4.0 (Ubuntu 8.4.0-1ubuntu1~18.04)
次に、auto コマンドの効果を後で示すために、gcc-7 に切り替えます。
$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gcc-8 9 auto mode
1 /usr/bin/gcc-7 5 manual mode
* 2 /usr/bin/gcc-8 9 manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/gcc-7 to provide /usr/bin/gcc (gcc) in manual mode
$ gcc -v
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
自動コマンド
上記のコマンドの結果: gcc->gcc-7。
リンクを作成するとき、gcc-7 の優先順位は 5、gcc-8 の優先順位は 9 (上位) です。
自動モードを使用すると、自動的に gcc-8 に切り替わります。
$ sudo update-alternatives --auto gcc
update-alternatives: using /usr/bin/gcc-8 to provide /usr/bin/gcc (gcc) in auto mode
$ gcc -v
gcc version 8.4.0 (Ubuntu 8.4.0-1ubuntu1~18.04)
削除コマンド
リンクを削除する
$ update-alternatives --list gcc
/usr/bin/gcc-7
/usr/bin/gcc-8
$ sudo update-alternatives --remove gcc /usr/bin/gcc-7
$ update-alternatives --list gcc
/usr/bin/gcc-8