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.

Порядок действий:

  1. Получить список альтернатив:

    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
    
  2. Как видно из этого списка, нужная альтернатива есть в списке, а значит, её можно просто выбрать из списка:

    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:
    
  3. Для выбора 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