Что именно делает update-альтернатива?
Что такое команда update-alternatives
используется для?
Возьмите этот пример:
sudo update-alternatives --install /usr/bin/java java /usr/local/java/jre1.7.0_09/bin/java 1
Что оно делает? Чем он отличается от добавления JDK к пути?
Допустим, я выполнил команду. Как бы я вернуться к исходному состоянию?
4 ответа
Обновляет ссылки в /etc/alternatives
указать программу для этой цели. Там много примеров, как x-www-browser
, editor
и т. д., которые будут ссылаться на браузер или редактор по вашему выбору. Некоторые сценарии или системные инструменты могут потребовать, чтобы вы редактировали файл вручную (например, конфликт конфигурации в dpkg
) и они будут искать альтернативы, чтобы дать вам выбор редактора. За java
это среда выполнения Java - Oracle, OpenJRE и т. д.
Ссылки в /etc/alternatives
просто символические ссылки. Вы можете увидеть их, используя, например,
ls -l /etc/alternatives
Более того, регулярный /usr/bin
двоичные файлы также являются символическими ссылками. Например:
ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Aug 14 10:33 /usr/bin/java -> /etc/alternatives/java
ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 46 Aug 14 10:33 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java
Так что нет PATH
должен быть изменен. Он просто использует символические ссылки.
Хотя ответ @gertvdjik является хорошим объяснением того, как альтернативы работают на более низком уровне, он явно не говорит, как вернуть исходное состояние.
Мне проще использовать соответствующий графический интерфейс galternatives
который доступен как пакет. Чтобы установить его, просто запустите:
sudo apt-get install galternatives
Тогда управление альтернативами станет намного проще. В частности, для java у вас есть много вспомогательных двоичных файлов, которые вам придется обновить, и их можно быстрее просмотреть в графическом интерфейсе.
update-alternatives создает, удаляет, поддерживает и отображает информацию о символических ссылках, составляющих систему альтернатив Debian.
...
Общее имя не является прямой символической ссылкой на выбранную альтернативу. Вместо этого это символическая ссылка на имя в каталоге альтернатив , которое, в свою очередь, является символической ссылкой на фактический файл, на который ссылаются. Это сделано для того, чтобы изменения системного администратора могли быть ограничены каталогом /etc ...
Источник и более подробная информация:man update-alternatives
.
В стороне: эта терминология master/slave может быть обновлена в какой-то момент.
Например, в Ubuntu 22.04 я могу переключать используемую Java сsudo update-alternatives --config java
:
$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 auto mode
1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode
* 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode
Press <enter> to keep the current choice[*], or type selection number:
Итак, чтобы ответить на исходные вопросы:
- update-alternatives обновляет символические ссылки
- из контекста похоже, что вы имели в виду PATH, однако он не меняет PATH или JDK, например, с Java 11 на Java 8 напрямую
- в нем нет встроенной истории , поэтому в общем случае невозможно вернуться в исходное состояние. Я ожидаю, что вам нужно выбрать наиболее подходящую альтернативу для состояния системы, которая работает для вас (на практике есть большая вероятность, что у вас есть только две альтернативы, когда вы впервые сталкиваетесь с этим, поэтому, если вы недавно установили вторую альтернативу, которая что-то сломала для вас есть только один другой, чтобы переключиться обратно)
А также
update-alternatives
можно создать группу для легкого переключения. Например, и нужно идти вместе, если переключается. затем
javaw
а также
javac
должны быть установлены как рабы
java
. Или же
oc
и (клиент openshift и управление kubernetes) тоже должны идти вместе. Я установил oc v3 и v4, и каждая версия идет со своим
kubectl
. Итак, я делаю:
sudo update-alternatives --install /usr/bin/oc oc /opt/oc3/oc 2 --slave /usr/bin/kubectl kubectl /opt/oc3/kubectl
sudo update-alternatives --install /usr/bin/oc oc /opt/oc4/oc 1 --slave /usr/bin/kubectl kubectl /opt/oc4/kubectl
Таким образом, oc3 и его kubectl имеют приоритет.