Система альтернатив - занятный механизм, сталкиваться с которым… — Остальные 90% — TG.ME

Система альтернатив - занятный механизм, сталкиваться с которым приходится редко. О себе он напоминает, внося элемент развлечения, когда нужно добраться до какого-нибудь стандартного исполняемого файла:
# Hmm, is 'open' a binary or a script?

$ command -v open
/usr/bin/open
$ file -b /usr/bin/open
symbolic link to /etc/alternatives/open
$ file -b /etc/alternatives/open
symbolic link to /usr/bin/xdg-open
$ file -b /usr/bin/xdg-open
POSIX shell script, ASCII text executable


Введена система была, чтобы иметь возможность выбирать предпочтительную утилиту среди нескольких, выполняющих схожие функции - например, текстовый редактор. Да, пользователь может выбрать его сам, используя переменные окружения EDITOR, VISUAL и иже с ними, однако в таком решении видится как минимум две проблемы:
1. Что вызывать, если пользователь не указал ничего?
2. Переменные окружения по умолчанию не сохраняются при вызове, например, sudo.
Имея установленные редакторы vim и nano, нельзя позволить каждой утилите самостоятельно решать, кого из них вызвать: от беспорядочного чередования редакторов пользователь взвоет уже через пару часов. Система альтернатив решает проблему, вводя единую для всех команду editor, ссылающуюся на единый, одинаковый для всех редактор (который в конечном счёте можно переопределить переменными окружения). Аналогично появляются команды pager, view, awk, cc и другие.

Как заметно в примере выше, механизм опирается на ферму ссылок в директории /etc/alternatives: универсальное имя /usr/bin/open ссылается на символическую ссылку /etc/alternatives/open, которая, в свою очередь, уже содержит путь к финальному скрипту /usr/bin/xdg-open. Первую же ссылку /usr/bin/open можно было бы направить сразу на конечный скрипт, однако тогда сменить его в некоторых конфигурациях ОС будет нельзя: нередко директория /usr/bin монтируется в режиме только на чтение, и перезаписать ссылку /usr/bin/open просто не получится. Чтобы избежать таких проблем, ферму разместили в поддиректории /etc, куда изменения обычно и вносятся, а в директории /usr/bin оставили неизменные ссылки на /etc/alternatives. При установке альтернативы ей также назначается приоритет, который позволяет выбрать утилиту в автоматическом режиме, если администратор не назначил её явно. Вся эта информация хранится в директории /var/lib/dpkg/alternatives, даже если альтернатива была установлена не из deb -пакета.

Управлять ссылками вручную нет необходимости - для работы с ними используется утилита update-alternatives. Регистрация альтернатив происходит обычно при установке deb-пакета, поставщики которого сами решают, к какой группе стоит отнести утилиту. Установить свою команду можно и самостоятельно, конечно:
# Run all as root

# 1. Create 2 alternative scripts:
$ cat /usr/local/bin/alttest.1
echo 'Hello Elliot'

$ cat /usr/local/bin/alttest.2
echo 'Hello Darlene'

# 2. Install alternatives:
# now /usr/bin/alttest will point to scripts
$ update-alternatives --install /usr/bin/alttest alttest \
/usr/local/bin/alttest.1 10
$ update-alternatives --install /usr/bin/alttest alttest \
/usr/local/bin/alttest.2 20

$ alttest
Hello Darlene


Теперь поменяем выбор:
$ update-alternatives --list alttest
/usr/local/bin/alttest.1
/usr/local/bin/alttest.2

# Set alttest.1 as default
$ update-alternatives --set alttest /usr/local/bin/alttest.1

$ update-alternatives --query alttest
...
Value: /usr/local/bin/alttest.1
...

$ alttest
Hello Elliot

# Clean up
$ update-alternatives --remove-all alttest
$ alttest
alttest: command not found


Чтобы посмотреть, какие имена установлены и альтернативы выбраны, пригодится команда update-alternatives --get-selections.

К чему это всё - после установки Ubuntu не забудьте выполнить sudo update-alternatives --set editor /usr/bin/vim.basic :)
www.opennet.ru
update-alternatives
update-alternatives (8) >> update-alternatives (8)
👍8🔥6❤4
June 9, 2025 666 7 10