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.

Answer from gertvdijk on askubuntu.com
๐ŸŒ
Ubuntu Manpages
manpages.ubuntu.com โ€บ manpages โ€บ trusty โ€บ en โ€บ man8 โ€บ update-alternatives.8.html
Ubuntu Manpage: update-alternatives - maintain symbolic links determining default commands
This is done so that the system ... is a Good Thing. When each package providing a file with a particular functionality is installed, changed or removed, update-alternatives is called to update information about that file in the alternatives system....
๐ŸŒ
Baeldung
baeldung.com โ€บ home โ€บ administration โ€บ the update-alternatives command in linux
The update-alternatives Command in Linux | Baeldung on Linux
July 24, 2024 - So, we can use config once again and select zero. However, we can use the auto command as well: $ sudo update-alternatives --auto editor update-alternatives: using /bin/nano to provide /usr/bin/editor (editor) in auto mode
๐ŸŒ
Linux Hint
linuxhint.com โ€บ update_alternatives_ubuntu
How to Use update-alternatives Command on Ubuntu โ€“ Linux Hint
using update-alternatives command, you can make a new executable python (/usr/local/bin/python) and add all the available Python versions to the alternatives database. Then, you can easily set which version of Python to use by default. You can also switch between the Python versions very easily.
๐ŸŒ
Debian
wiki.debian.org โ€บ DebianAlternatives
DebianAlternatives - Debian Wiki
If you have added the new alternative with a higher priority it will be automatically promoted to the default: $ update-alternatives --config www-browser There are 2 choices for the alternative www-browser (providing /usr/bin/www-browser).
๐ŸŒ
Thomas Venturini
thomasventurini.com โ€บ articles โ€บ how-to-use-update-alternatives
How to use update-alternatives | Thomas Venturini
May 21, 2021 - sudo update-alternatives --config code ยท Choose code-insiders and from now on you can start it through the code command. When you don't have installed vim or code already but want install an alternative for it anyways, then you can just type ...
๐ŸŒ
Ming's Blog
bitmingw.com โ€บ 2019 โ€บ 08 โ€บ 28 โ€บ ubuntu-update-alternatives
Changing the Default Program with update alternatives | Ming's Blog
January 1, 2026 - Ubuntu keeps track of the default ... more than one option (i.e. alternatives). To list all entries of alternatives in the system, use update-alternatives --get-selections....
Find elsewhere
๐ŸŒ
Ask Ubuntu
askubuntu.com โ€บ questions โ€บ tagged โ€บ update-alternatives
Newest 'update-alternatives' Questions - Ask Ubuntu
The following works for OpenSSL 3 (after sudo -i): update-alternatives \ --install /usr/bin/openssl ... ... Qualcom Snapdragon X Elite Arm64 Desktop support. When can we expect this to happen? Do you yet have a time frame? ... After updating from 20.04 LTS to 22.04 LTS, everything appears to be working fine, except if I run sudo apt upgrade I get the following issue: Setting up cpp (4:11.2.0-1ubuntu1) ... update-... ... These links: https://manpages.ubuntu.com/cgi-bin/search.py?q=update-alternatives https://askubuntu.com/search?q=update-alternatives ...
๐ŸŒ
Linux Man Pages
linux.die.net โ€บ man โ€บ 8 โ€บ update-alternatives
update-alternatives(8) - Linux man page
alternatives creates, removes, maintains and displays information about the symbolic links comprising the alternatives system. The alternatives system is a reimplementation of the Debian alternatives system. It was rewritten primarily to remove the dependence on perl; it is intended to be a drop in replacement for Debian's update-dependencies script.
๐ŸŒ
GitHub
gist.github.com โ€บ cobaohieu โ€บ 7bfb9a8a1130c54285a0a3f3517cff26
update-alternatives for terminal on Ubuntu ยท GitHub
$ sudo apt update $ sudo apt-get upgrade -y $ sudo apt-get dist-upgrade -y $ sudo apt-get install build-essential software-properties-common manpages-dev -y $ sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y $ sudo apt-get update -y ยท Install Tilix if you wanna use this as a main terminal ... $ sudo update-alternatives --config x-terminal-emulator There are 7 choices for the alternative x-terminal-emulator (providing /usr/bin/x-terminal-emulator).
๐ŸŒ
DEV Community
dev.to โ€บ webduvet โ€บ how-to-manage-versions-using-update-alternatives-258e
How to manage versions using update-alternatives - DEV Community
November 24, 2022 - Update-alternatives in Debian based system like Ubuntu is used as default option by apt, however, it offers the command-line interface to interact with the settings and to add and remove entries manually.
๐ŸŒ
GitHub
gist.github.com โ€บ joesan โ€บ c947ac9c9c3b851f818b29fe20084fdf
update-alternatives for python3 on Ubuntu ยท GitHub
ls -larth `which python`* -rwxr-xr-x 2 root root 4.3M Nov 17 19:23 /usr/bin/python3.5 -rwxr-xr-x 1 root root 3.4M Nov 19 09:35 /usr/bin/python2.7 lrwxrwxrwx 1 root root 24 Feb 5 09:36 /usr/bin/python -> /etc/alternatives/python ... sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 2 $ sudo update-alternatives --config python There are 2 choices for the alternative python (providing /usr/bin/python).
๐ŸŒ
GeeksforGeeks
geeksforgeeks.org โ€บ linux-unix โ€บ how-to-use-update-alternatives
How to use update-alternatives - GeeksforGeeks
July 23, 2025 - In conclusion, integrating Neovim installed via Snap into Ubuntu's update-alternatives system can be achieved through two methods. The first method involves using the update-alternatives command to seamlessly integrate Neovim with specified priorities, while the second method manually creates a symbolic link for Neovim.
๐ŸŒ
TecAdmin
tecadmin.net โ€บ linux-update-alternatives-command
Update-alternatives Command: A Comprehensive Guide for Linux Users โ€“ TecAdmin
April 26, 2025 - For example, you have 2 versions of Java installed on your system. Thyen you can install the alternatives as: sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1100 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 800
๐ŸŒ
GitHub
gist.github.com โ€บ cobaohieu โ€บ ded429cb892b46ae9bfd9919a11e593a
update-alternatives for gcc on Ubuntu - Gist - GitHub
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gcov gc
Top answer
1 of 12
84

Assuming one has installed a JDK in /opt/java/jdk1.8.0_144 then:

  1. Install the alternative for javac

    $ sudo update-alternatives --install /usr/bin/javac javac /opt/java/jdk1.8.0_144/bin/javac 1
    
  2. Check / update the alternatives config:

    $ sudo update-alternatives --config javac
    

If there is only a single alternative for javac you will get a message saying so, otherwise select the option for the new JDK.

To check everything is setup correctly then:

$ which javac
/usr/bin/javac

$ ls -l /usr/bin/javac
lrwxrwxrwx 1 root root 23 Sep  4 17:10 /usr/bin/javac -> /etc/alternatives/javac

$ ls -l /etc/alternatives/javac
lrwxrwxrwx 1 root root 32 Sep  4 17:10 /etc/alternatives/javac -> /opt/java/jdk1.8.0_144/bin/javac

And finally

$ javac -version
javac 1.8.0_144

Repeat for java, keytool, jar, etc as needed.

2 of 12
76

You will notice a big change when selecting options if you type in "java -version" after doing so. So if you run update-alternatives --config java and select option 3, you will be using the Sun implementation.
Also, with regards to auto vs manual mode, making a selection should take it out of auto mode per this page stating:

When using the --config option, alternatives will list all of the choices for the link group of which given name is the master link. You will then be prompted for which of the choices to use for the link group. Once you make a change, the link group will no longer be in auto mode. You will need to use the --auto option in order to return to the automatic state.

And I believe auto mode is set when you install the first/only JRE/JDK.

๐ŸŒ
Reddit
reddit.com โ€บ r/linux4noobs โ€บ understanding update-alternatives
r/linux4noobs on Reddit: Understanding update-alternatives
August 2, 2019 -

(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

Top answer
1 of 2
9

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;

2 of 2
0

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 !

๐ŸŒ
LinuxConfig
linuxconfig.org โ€บ home โ€บ how to set default programs using update-alternatives on debian-based distributions
How to set default programs using update-alternatives on Debian-based distributions
February 1, 2023 - To change an alternative for a group interactively, we invoke update-alternatives with the --config option and pass the name of the group as argument. When performing a writing operation, we need to launch the command using privilege escalation.
๐ŸŒ
guvi.in
studytonight.com โ€บ linux-guide โ€บ update-alternatives-command-in-linux
update-alternatives Command in Linux
February 13, 2023 - Learn how to use the update-alternatives command in Linux to manage, switch, and configure multiple versions of the same program.