# 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 :)

