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.
java - what is update-alternatives command in linux and what is the use of it? - Stack Overflow
command line - Better way to add alternative using update-alternatives? - Unix & Linux Stack Exchange
debian - Install man pages in directory with update-alternatives - Unix & Linux Stack Exchange
Understanding update-alternatives
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.
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.
Basically it says to your machine to use this alternative of Jave JDK instead of the default one, which, in Linux systems, is OpenJDK.
A brief extract from the man page is better than any answer I could write:
update-alternatives creates, removes, maintains and displays information about the symbolic links comprising the Debian alternatives system.
It is possible for several programs fulfilling the same or similar functions to be installed on a single system at the same time. For example, many systems have several text editors installed at once. This gives choice to the users of a system, allowing each to use a different editor, if desired, but makes it difficult for a program to make a good choice for an editor to invoke if the user has not specified a particular preference.
Debian's alternatives system aims to solve this problem. A generic name in the filesystem is shared by all files providing interchangeable functionality. The alternatives system and the system administrator together determine which actual file is referenced by this generic name. For example, if the text editors ed(1) and nvi(1) are both installed on the system, the alternatives system will cause the generic name /usr/bin/editor to refer to /usr/bin/nvi by default. The system administrator can override this and cause it to refer to /usr/bin/ed instead, and the alternatives system will not alter this setting until explicitly requested to do so.
With --install you specified a link, "/usr/bin/java" a name "java" and a path "/usr/lib/java/JDK...." and you add a group of alternatives to the system. link is the generic name for the master link, name is the name of its symlink in the alternatives directory, and path is the alternative being introduced for the master link.
I hope to be clear enough, Here there is a post regarding java alternatives.
For the complete usage list I suggest to look at the same manual page, typing man update-alternatives on your OS shell;
i want to explain it for you from scratch ... if you have 2 or more versions of a program that starts with a same command in linux you can use update-alternatives command for determining the default version of that program and you can also change the default version of that command easily .. assume that you have 2 version of python on your system. python 2 & python 3. by default python command on linux starts the python2 interpreter on the shell . you think that python 2 is old and you want to use python 3 instead of python2 . one of the solution is that you enter python3 command on the shell and start the python interpreter that its version is more than 3 ... but you want to enter python command and shell recognize that you want to run python3 interpreter . here,update-alternatives command do it's work and determine the default version and versions of a program you want to use for a specific command .
i told you that python command start python 2 interpreter by default . you want to change it . follow the example :
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1.
when you execute this command on linux you are telling to shell that after this time two links of two different programs are linked to python command on linux .. infact you install the python3 program on python command on linux and two programs exist at 1 command that you can change the defaults of these programs and run what of these programs you want by changing priority in command or configure it manually to set the default program ..
hope this is useful for you !
Why is there a "java" in quotes
To quote the Ubuntu man page this text is the "name," which "is the name of its symlink in the alternatives directory." In other words this is so when you type java (or whatever text you choose) in the terminal it knows you are looking for this particular link.
what is the purpose of the 1?
Again from the man page this is the "priority" which is used for the following purpose - "when a link group is in automatic mode, the alternatives system ensures that the links in the group point to the highest priority alternative appropriate for the group." In other words if a decision needs to be made as to which link is used, the numerically higher value wins out. I suspect however it may be inconsequential, by using update-alternatives you are switching the default from "automatic" to "manual" in which case I don't think it applies. But I am no expert.
There is a useful post from William DeMeo for background.
If you run command :
$man update-alternatives
Output:
alternatives [options] --install link name path priority [--slave link name path]... [--initscript service]
The java means that want to update java with a priority on either 1, 2, 3, etc.
You need to mention the path and all parameters in the given order above.
To answer your first question I'd like to hint you to --query:
--query name
Display information about the link group like --display does, but in a machine parseable way (see section QUERY FORMAT below).
Armed with this you will get the link source, e.g. in my case for java:
usr@srv % update-alternatives --query java
Name: java
Link: /usr/bin/java
[...]
So, you see my chain goes like /usr/bin/java -> /etc/alternatives/java -> ....
Unfortunately, I don't have an answer to your second question. I've been searching for a solution for this some time ago, but it seems that there is no simple workaround, yet. What you could do is writing some hack to parse the output of the --query call, maybe like this:
update-alternatives --query java | /bin/grep Link | cut -f 2 -d " "
which you could then use as input for the --install call. But since this is quite messy in my opinion I won't recommend it. Instead you might want to have a look at galternatives, a front-end to the alternatives system. Even if I don't like to use graphical stuff for such basic jobs it is quite convenient and I ended up using this tool instead of the command line tools.
EDIT
I've been curious how update-alternatives knows what's the command symlink and took a short look into the sources. Of course the alternatives system has to store the config for each group and it turns out that it's called administrative directory and written on the man page ;-)
You'll find this information in /var/lib/dpkg/alternatives (by default). The second line in each of these files defines the master link you're looking for. You may extract it like this:
usr@srv $ sed -ne 2p /var/lib/dpkg/alternatives/java
/usr/bin/java
However, this is just a workaround for those having an older version of update-alternatives.
Simpleton question here: Isn't the <link> always going to be the same one retrieved by a simple which [program] since that is the link that the system uses to call a program by command-line?
For instance, tracing back the links for pycharm I get:
user@computer:~$ which pycharm
/usr/bin/pycharm
user@computer:~$ ll /usr/bin/pycharm
lrwxrwxrwx 1 root root 25 Mar 12 2015 /usr/bin/pycharm -> /etc/alternatives/pycharm*
user@computer:~$ ll /etc/alternatives/pycharm
lrwxrwxrwx 1 root root 43 Mar 12 2015 /etc/alternatives/pycharm -> /opt/pycharm-community-4.0.5/bin/pycharm.sh*
And I can then use:
sudo update-alternatives --install /usr/bin/pycharm pycharm /opt/pycharm-community-4.5.0/bin/pycharm.sh 0
For my new pycharm install.
Then maybe you could construct a script to use the output of which.
(tl;dr at bottom)
Apologies for sounding dumb, but I'm trying to understand Ubuntu's update-alternatives by reading the man pages and I just can't seem to understand it.
I'm trying to set atom (/usr/bin/atom) as an alternative for editor. There are two ways the man pages seem to be telling me to do it, but I get an error on both that I don't totally understand:
$ sudo update-alternatives --set editor /usr/bin/atom update-alternatives: error: alternative /usr/bin/atom for editor not registered; not setting
There's also update-alternatives --install <link> <name> <path> <priority>, but I can't figure out what it wants for <link>. For all other alternatives it seems to just be a symlink to <path>, which is a bit strange, but I tried creating a symlink and I got an error Okay, now I'm not getting the same error, but it was something like "Max recursion reached". Now I can set the editor alternative to atom, but nothing appears to be different when I try to open a text document.
I feel like I'm just misunderstanding the arguments... could I get some help, please?
TL;DR I want to set /usr/bin/atom as the editor alternative, how do I do it