Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I'm sorry for my bad writing, I'm not a native speaker.

I've looked up the manual of update-alternatives several times but I can't find out how to show the current link pointing to a specific alternative, and that information is needed when adding a new alternative.

From the update-alternatives manual:

--install <link> <name> <path> <priority>

Let's say I want to add a new version of Java Runtime Edition, but I don't know the current symlink that links to the alternative (<link> parameter). What I currently do is:

sudo update-alternatives --install /tmp/randomStuff java /usr/local/java/jre1.7.0_25/bin/java 0

That command will output:

update-alternatives: renaming java link from /usr/local/bin/java to /tmp/randomStuff.

Reading the output I find out the old link that was pointing to the alternative, so I can finally run my command again with the right <link> parameter, changing /tmp/randomStuff to /usr/local/bin/java:

sudo update-alternatives --install /usr/local/bin/java java /usr/local/java/jre1.7.0_25/bin/java 0

That works fine, but as you see, running the command with /tmp/randomStuff as the <link> parameter is very awkward.

So, here comes the questions: (1) Are there any update-alternative arguments that can output the current link that is pointing to a specific alternative, or (2) is there a way to install a new alternative without having to provide a new parameter, simply keeping the current <link>?

Thanks for your help.

share|improve this question

1 Answer 1

up vote 5 down vote accepted

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.

share|improve this answer
    
Thanks for answering, but the version of update-alternatives that I'm running (1.16.1.2) does not show link information using neither --query or --display. What version are you using? sudo update-alternatives --query java Link: java Status: auto Best: /usr/local/java/jre1.6.0_45/bin/java Value: /usr/local/java/jre1.6.0_45/bin/java Alternative: /usr/local/java/jre1.6.0_45/bin/java Priority: 0 –  pagliuca Jul 7 '13 at 5:00
    
I've 1.16.10 installed. Can't you update your version? –  binfalse Jul 7 '13 at 8:51
    
You are the man! Both solutions are excellent! –  pagliuca Jul 7 '13 at 17:32

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.