update-alternatives
действительно можно использовать для управления символическими ссылками в /bin
или где-либо еще; это его цель . Для этого требуются взаимодействующие пакеты или ручная настройка — необходимо зарегистрировать различные варианты.
dpkg-reconfigure
не является чем-то конкретным, он просто запускает сценарий -после установки пакета. Таким образом, его поведение полностью зависит от конкретного пакета, который он использует для настройки. В случае bash
и dash
скрипты сопровождающего обрабатывают символическую ссылку /bin/sh
, так что да, в данном конкретном случае dpkg-reconfigure
используется для управления символической ссылкой.
Причина, по которой bash
и dash
не используют update-alternatives
для управления /bin/sh
, заключается просто в том, что когда эта возможность была включена, update-alternatives
не считалась достаточно надежной, чтобы на нее можно было положиться в таких случаях. конфиденциальный файл как /bin/sh
. Если что-то когда-нибудь пойдет не так и /bin/sh
будет удалено,или указывая на -несуществующий файл, система оказывается в значительной степени бесполезной и ее трудно исправить; он даже не загрузится должным образом... Так что bash
и dash
очень внимательно следят за тем, чтобы /bin/sh
всегда можно было использовать. Это включает в себя некоторую тщательную обработку их «сценария» перед -установкой (, который на самом деле является двоичным, чтобы избежать предварительных -циклов зависимостей ), трюка с участием dpkg-divert
и некоторых последних -канав обработка в их посте -скриптов установки. Детали конструкции всего этого вы найдете в ошибка #34717(девятнадцать лет назад ).
Чтобы узнать, какие двоичные файлы в системе обрабатываются с помощью альтернатив, а какие обрабатываются с помощью отклонений (из сценариев сопровождающего ), вы можете использовать соответствующие инструменты, в частности dpkg-divert --list
, которые будут отображать все отклонения. Для update-alternatives --list
вам нужно знать интересующую вас альтернативную группу, но альтернативы легко обнаружить, потому что все они являются символическими ссылками на файл в /etc/alternatives
.
Попробуйте это:
groups <username> | tr ' ' '\n' | grep "abc"
Дело в том, что groups <username>
разделяет каждую группу пробелом, а grep
работает с строками . Вот почему вы можете просто поменять местами пробелы с символом новой строки \n
с помощью tr
, а затем использовать grep
.
Вы можете попробовать использовать эту команду без | grep "abc"
в конце, чтобы также увидеть промежуточный результат.
Во-первых, давайте сопоставим только указанные имена групп, избегая совпадений подстрок в других именах групп:
$ groups
foo foobar baz ban bat
$ groups | grep --regexp=foo --regexp=ban --word-regexp
[outputs "foo foobar baz ban bat" with only "foo" and "ban" highlighted]
Чтобы перечислить только фактические совпадения:
$ groups | grep --only-matching --regexp=foo --regexp=ban --word-regexp
foo
ban