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