0040 — Update alternatives
Что такое альтернативы
Иногда хочется или приходится иметь на компьютере несколько версий одного и того же ПО. Чаще всего речь идёт о Ruby и Python, хотя возможны варианты, например, тот же PHP, Emacs или Wine.
При установке в каталоге /usr/bin/
создается символическая ссылка для запуска исполняемого файла приложения.
Теперь, когда вы вводите в терминале команду python3
, запускается интерпретатор Python 3.
А если в системе установлены одновременно Python 3.7 и Python 3.9, как система определяет, какой из них запускать по команде python3
? Кто последний — тот и прав? Или как это работает?
На этот случай придумали альтернативы — список вариантов, из которых можно выбрать правильный ответ. Только не интерактивно, в момент вызова команды, а «по умолчанию»: вот у нас команда, вот список исполняемых файлов, которые можно использовать, а вот тот из них, который используется сейчас.
Как устроены альтернативы
Альтернативы — это набор записей, состоящих из следующих полей:
путь к символической ссылке, используемой для запуска альтернативы;
команда для запуска альтернативы;
путь к исполняемому файлу, который будет запущен на самом деле;
приоритет — чем меньше, тем лучше.
Если альтернатив нет, то используется приоритет
0
.
Обновление альтернатив
Допустим, у нас в Debian Linux (или производном дистрибутиве) установлен Python версии 3.7. При выполнении команды python3
мы видим примерно такое приглашение командной строки:
Python 3.7.3 (default, Sep 19 2023, 08:52:39)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Допустим, мы установили Python версии 3.9. Однако, при выполнении команд python3
и /usr/bin/python3
по прежнему активируется Python 3.7.
Можно зайти в каталог /usr/bin/
и заменить символическую ссылку python3
на Python 3.9. Однако, это не совсем корректный путь. Более правильный путь — использовать команду update-alternatives
.
Порядок действий:
Получить список альтернатив:
update-alternatives --display python3
В терминал выводится список альтернатив:
python3 - автоматический режим link best version is /usr/bin/python3.7 ссылка сейчас указывает на /usr/bin/python3.7 link python3 is /usr/bin/python3 /usr/bin/python3.7 — приоритет 2 /usr/bin/python3.9 — приоритет 0
Как видно из этого списка, нужная альтернатива есть в списке, а значит, её можно просто выбрать из списка:
sudo update-alternatives --config python3
В терминал выводится запрос:
Есть 2 варианта для альтернативы python3 (предоставляет /usr/bin/python3). Выбор Путь Приор Состояние ------------------------------------------------------------ * 0 /usr/bin/python3.7 1 автоматический режим 1 /usr/bin/python3.7 1 ручной режим 2 /usr/bin/python3.9 0 ручной режим Press <enter> to keep the current choice[*], or type selection number:
Для выбора Python 3.9 вместо 3.7 нужно ввести номер позиции —
2
, и нажать [Enter].Также поддерживается неинтерактивное изменение альтернативы (удобно использовать в скриптах):
sudo update-alternatives --set python3 /usr/bin/python3.9
Установка альтернативы
Допустим, нужно альтернативы нет в списке. В этом случае её туда нужно добавить с помощью этой команды:
sudo update-alternatives --install <alternative> <short_name> <exec> <priority>
Здесь:
<alternative>
– путь к полной команде, вызываемой для запуска альтернативы.Как правило, здесь указывается ссылка на общее имя в каталоге
/usr/bin
. Например, в случае с Python 3 нужно указать значение/usr/bin/python3
.<short_name>
– краткое наименование (команда, используемая для запуска).Для Python 3 нужно использовать значение
python3
.<exec>
– полный путь к исполняемому файлу, запускаемому альтернативой.Для определения значения этого параметра можно использовать команду
which
, например:which python3.9
<priority>
– приоритет.Альтернатива с приоритетом
0
используется по умолчанию.
Допустим, мы хотим добавить Python 3.9 в список альтернатив и использовать его по умолчанию. В этом случае команда имеет такой вид:
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 0
Удаление альтернативы
Удаление альтернативы производится с помощью команды:
sudo update-alternatives --remove <short_name> <exec>
Например, чтобы из списка альтернатив удалить Python 3.7 следует использовать команду:
sudo update-alternatives --remove python3 /usr/bin/python3.7