Альтернативы: Как обрабатывать одну и ту же команду в нескольких пакетах

Альтернативы используются когда одна и та же команда поставляется несколькими пакетами. Классическим примером является busybox, который предоставляет целый список таких команд, как /bin/ls и /bin/find, которые также содержатся в пакетах coreutils (/bin/ls) и findutils (/bin/find).

Чтобы пользователь мог выбрать, какую версию команды устанавливать, и требуется система обработки альтернатив. Должно быть возможно установить одну альтернативу, или обе, или удалить одну когда обе установлены, и при этом не должно возникать ошибок при перезаписи одним пакетов файлов других пакетов.

Наиболее частой причиной использования альтернатив является уменьшение размера бинарных файлов. Удаляя дополнительные возможности, встроенные подсказки, сообщения об ошибках и объединяя несколько бинарников в один большой файл обычно можно сэкономить значительное количество памяти. Чаще всего во встраиваемых системах команды выполняются неинтерактивно и такие изменения не окажут особых неудобств пользователю. Но в некоторых ситуациях интерактивный доступ всё-таки нужен и тогда должна быть возможность установки полнофункциональной версии.

Пример альтернативных команд

Большая часть дистрибутивов включает busybox вместо полнофункциональных версий команд. Следующий пример показывает типичную установку, в которой используется busybox версия команды find:

root@titan:~$ find --version
find --version
BusyBox v1.2.1 (2006.12.17-05:10+0000) multi-call binary

Usage: find [PATH...] [EXPRESSION]

root@titan:~$ which find
which find
/usr/bin/find
	  

Теперь мы установим полную версию find:

root@titan:~$ ipkg install findutils
ipkg install findutils
Installing findutils (4.2.29-r0) to root...
Downloading http://nynaeve.twibble.org/ipkg-titan-glibc//./findutils_4.2.29-r0_sh4.ipk
Configuring findutils

update-alternatives: Linking //usr/bin/find to find.findutils
update-alternatives: Linking //usr/bin/xargs to xargs.findutils
	  

Видно, что стандартная версия find поменялась на полнофункциональную:

root@titan:~$ find --version
find --version
GNU find version 4.2.29
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION
root@titan:~$ which find
which find
/usr/bin/find
    

Использование update-alternatives

Доступно два метода использования системы альтернатив:

  1. update-alternatives class - простейший метод, однако применим не во всех ситуациях. Он подходит только при наличии единственной альтернативы. В случае многих альтернатив они должны быть вручную зарегистрированы в post install.

  2. Вызов команды update-alternatives напрямую.

Подробности по обоим методам приведены в разделе update-alternatives class справочника.