What exactly does `update-alternatives` do?

What is the command update-alternatives used for?

Take this example:

sudo update-alternatives --install /usr/bin/java java /usr/local/java/jre1.7.0_09/bin/java 1

What does it do? How is it different from adding jdk to the path?

Let's say that I have run the command. How would I revert back to the original state?

1

3 Answers

It updates the links in /etc/alternatives to point to the program for this purpose. There's lots of examples, like x-www-browser, editor, etc. that will link to the browser or editor of your preference. Some scripts or system tools may want you to edit a file manually (e.g. configuration conflict in dpkg) and they'll look into the alternatives to give you the editor of choice. For java, this is the Java runtime environment - Oracle's, OpenJRE, etc.

The links in /etc/alternatives are just symbolic links. You can see them using for example

ls -l /etc/alternatives

Moreover, the regular /usr/bin binaries are also symlinks. E.g.:

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

So, no PATH has to be modified. It just uses symbolic links.

3

While @gertvdjik's answer is a good explanation of how alternatives work at the lower level, it doesn't explicitly say how to revert the original state.

I find it easier to use the corresponding GUI galternatives which is available as a package. To install it, just run:

sudo apt-get install galternatives

Then managing alternatives becomes much easier. For java in particular, you have a lot of auxiliary binaries which you'll have to update and it's faster to overview them in the GUI.

And update-alternatives can create a group to switch easily. For example javaw, java and javac needs to go together if java switches. Then javaw and javac should be installed as slaves of java. Or oc and kubectl (openshift client and kubernetes control) should go together, too. I have installed oc v3 and v4, and each version goes with its own kubectl. So I do:

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

So oc3 and its kubectl are prioritized.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like